Поиск…


Стиль петли

В то время как

Самый тривиальный тип цикла. Единственный недостаток - нет никакой внутренней подсказки, чтобы знать, где вы находитесь в цикле.

/// 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;

замечания

  1. Тип ItemType не должен соответствовать точному типу элементов, его просто необходимо назначить из типа элементов
  2. Вместо ItemType можно также использовать var , который выведет тип элементов из ItemType , ItemType общий аргумент реализации IEnumerable
  3. Оператором может быть блок, один оператор или даже пустой оператор ( ; )
  4. Если enumerableObject не реализует IEnumerable , код не будет компилироваться
  5. Во время каждой итерации текущий элемент 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, с четко определенными условиями выхода, могут не принести столько пользы.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow