C# Language
перекручивание
Поиск…
Стиль петли
В то время как
Самый тривиальный тип цикла. Единственный недостаток - нет никакой внутренней подсказки, чтобы знать, где вы находитесь в цикле.
/// loop while the condition satisfies
while(condition)
{
/// do something
}
Делать
Подобно while
, но условие оценивается в конце цикла вместо начала. Это приводит к выполнению циклов хотя бы один раз.
do
{
/// do something
} while(condition) /// loop while the condition satisfies
За
Еще один тривиальный стиль цикла. Цикл индекса ( i
) увеличивается, и вы можете его использовать. Он обычно используется для обработки массивов.
for ( int i = 0; i < array.Count; i++ )
{
var currentItem = array[i];
/// do something with "currentItem"
}
Для каждого
Модернизированный способ петли через IEnumarable
объекты. Хорошо, что вам не нужно думать об индексе элемента или о количестве элементов списка.
foreach ( var item in someList )
{
/// do something with "item"
}
Метод Foreach
В то время как другие стили используются для выбора или обновления элементов в коллекциях, этот стиль обычно используется для вызова метода сразу для всех элементов в коллекции.
list.ForEach(item => item.DoSomething());
// or
list.ForEach(item => DoSomething(item));
// or using a method group
list.ForEach(Console.WriteLine);
// using an array
Array.ForEach(myArray, Console.WriteLine);
Важно отметить, что этот метод доступен только в экземплярах List<T>
и как статический метод для Array
- он не является частью Linq.
Linq Parallel Foreach
Точно так же, как Linq Foreach, за исключением того, что эта задача выполняется параллельно. Это означает, что все элементы в коллекции будут одновременно выполнять задание одновременно.
collection.AsParallel().ForAll(item => item.DoSomething());
/// or
collection.AsParallel().ForAll(item => DoSomething(item));
перерыв
Иногда условие цикла должно быть проверено в середине цикла. Первый, возможно, более изящный, чем последний:
for (;;)
{
// precondition code that can change the value of should_end_loop expression
if (should_end_loop)
break;
// do something
}
Альтернатива:
bool endLoop = false;
for (; !endLoop;)
{
// precondition code that can set endLoop flag
if (!endLoop)
{
// do something
}
}
Примечание. В вложенных циклах и / или switch
необходимо использовать не просто break
.
Перекрестная петля
foreach будет перебирать любой объект класса, который реализует IEnumerable
(обратите внимание, что IEnumerable<T>
наследует от него). Такие объекты включают некоторые встроенные, но не ограничивают: List<T>
, T[]
(массивы любого типа), Dictionary<TKey, TSource>
, а также интерфейсы, такие как IQueryable
и ICollection
и т. Д.
синтаксис
foreach(ItemType itemVariable in enumerableObject)
statement;
замечания
- Тип
ItemType
не должен соответствовать точному типу элементов, его просто необходимо назначить из типа элементов - Вместо
ItemType
можно также использоватьvar
, который выведет тип элементов изItemType
,ItemType
общий аргумент реализацииIEnumerable
- Оператором может быть блок, один оператор или даже пустой оператор (
;
) - Если
enumerableObject
не реализуетIEnumerable
, код не будет компилироваться - Во время каждой итерации текущий элемент
ItemType
вItemType
(даже если это не указано, а компилятор - выводится черезvar
), и если элемент не может бытьInvalidCastException
будетInvalidCastException
.
Рассмотрим этот пример:
var list = new List<string>();
list.Add("Ion");
list.Add("Andrei");
foreach(var name in list)
{
Console.WriteLine("Hello " + name);
}
эквивалентно:
var list = new List<string>();
list.Add("Ion");
list.Add("Andrei");
IEnumerator enumerator;
try
{
enumerator = list.GetEnumerator();
while(enumerator.MoveNext())
{
string name = (string)enumerator.Current;
Console.WriteLine("Hello " + name);
}
}
finally
{
if (enumerator != null)
enumerator.Dispose();
}
Пока цикл
int n = 0;
while (n < 5)
{
Console.WriteLine(n);
n++;
}
Выход:
0
1
2
3
4
IEnumerators можно повторить с помощью цикла while:
// Call a custom method that takes a count, and returns an IEnumerator for a list
// of strings with the names of theh largest city metro areas.
IEnumerator<string> largestMetroAreas = GetLargestMetroAreas(4);
while (largestMetroAreas.MoveNext())
{
Console.WriteLine(largestMetroAreas.Current);
}
Пример вывода:
Токио / Йокогама
Нью-Йорк Метро
Сан-Паулу
Сеул / Инчхон
Для цикла
A For Loop отлично подходит для выполнения определенных задач. Это похоже на цикл While Loop, но приращение включено в условие.
A For Loop настроен следующим образом:
for (Initialization; Condition; Increment)
{
// Code
}
Инициализация - создает новую локальную переменную, которая может использоваться только в цикле.
Условие. Цикл работает только тогда, когда условие истинно.
Приращение - как переменная изменяется при каждом запуске цикла.
Пример:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
Выход:
0
1
2
3
4
Вы также можете оставить пробелы в For Loop, но для этого вам нужно иметь все точки с запятой.
int input = Console.ReadLine();
for ( ; input < 10; input + 2)
{
Console.WriteLine(input);
}
Выход для 3:
3
5
7
9
11
Do - While Loop
Это похоже на while
цикл, за исключением того, что он проверяет условие в конце тела цикла. Цикл Do - While выполняет цикл один раз независимо от того, является ли условие истинным или нет.
int[] numbers = new int[] { 6, 7, 8, 10 };
// Sum values from the array until we get a total that's greater than 10,
// or until we run out of values.
int sum = 0;
int i = 0;
do
{
sum += numbers[i];
i++;
} while (sum <= 10 && i < numbers.Length);
System.Console.WriteLine(sum); // 13
Вложенные петли
// Print the multiplication table up to 5s
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= 5; j++)
{
int product = i * j;
Console.WriteLine("{0} times {1} is {2}", i, j, product);
}
}
Продолжить
В дополнение к break
существует также ключевое слово continue
. Вместо полного прорыва цикла он просто пропустит текущую итерацию. Это может быть полезно, если вы не хотите, чтобы какой-либо код выполнялся, если задано определенное значение.
Вот простой пример:
for (int i = 1; i <= 10; i++)
{
if (i < 9)
continue;
Console.WriteLine(i);
}
Это приведет к:
9
10
Примечание. Continue
часто очень полезно в циклах while или do-while. For-loops, с четко определенными условиями выхода, могут не принести столько пользы.