В чем основное отличие между циклами for
и foreach
?
В каких сценариях мы можем использовать for
, а не foreach
и наоборот.
Можно ли показать с помощью простой программы?
Оба кажутся мне одинаковыми. Я не могу отличить их.
В чем основное отличие между циклами for
и foreach
?
В каких сценариях мы можем использовать for
, а не foreach
и наоборот.
Можно ли показать с помощью простой программы?
Оба кажутся мне одинаковыми. Я не могу отличить их.
a for
loop - это конструкция, которая говорит: "Выполняйте эту операцию n. times".
a foreach
loop - это конструкция, которая говорит: "Выполняйте эту операцию против каждого значения/объекта в этом IEnumerable"
Вы можете использовать foreach
, если объект, который вы хотите перебрать, реализует интерфейс IEnumerable
. Вам нужно использовать for
, если вы можете получить доступ к объекту только по индексу.
Я попробую ответить на это более общим подходом:
foreach
используется для перебора по каждому элементу заданного набора или списка (что-либо реализующее IEnumerable
) предопределенным образом. Вы не можете влиять на точный порядок (кроме пропусков или отмены всего цикла), как это определено контейнером.
foreach (String line in document) { // iterate through all elements of "document" as String objects
Console.Write(line); // print the line
}
for
- это еще один способ написать цикл, в котором был выполнен код, прежде чем вводить цикл и один раз после каждой итерации. Он обычно используется для циклического кодирования определенного количества раз. В отличие от foreach
здесь вы можете влиять на текущую позицию.
for (int i = 0, j = 0; i < 100 && j < 10; ++i) { // set i and j to 0, then loop as long as i is less than 100 or j is less than 10 and increase i after each iteration
if (i % 8 == 0) { // skip all numbers that can be divided by 8 and count them in j
++j
continue;
}
Console.Write(i);
}
Console.Write(j);
Если возможно и применимо, всегда используйте foreach
, а не for
(предполагая там некоторый индекс массива). В зависимости от внутренней организации данных foreach
может быть намного быстрее, чем при использовании for
с индексом (особенно при использовании связанных списков).
Каждый дал вам правильный ответ в отношении foreach, т.е. это способ прокрутки элементов чего-то, реализующего IEnumerable.
С другой стороны, для гораздо более гибкого, чем то, что показано в других ответах. Фактически, for используется для выполнения блока операторов до тех пор, пока указанное условие является истинным.
Из документации Microsoft:
for (initialization; test; increment)
statement
инициализация Необходимые. Выражение. Это выражение выполняется только один раз, прежде чем цикл будет выполнен.
тест Необходимые. Булевое выражение. Если проверка истинна, выполняется оператор. Если проверить, если false, цикл завершается.
приращение Необходимые. Выражение. Выражение приращения выполняется в конце каждого прохода через цикл.
Заявление Необязательный. Заявление, которое должно быть выполнено, если тест верен. Может быть составным утверждением.
Это означает, что вы можете использовать его разными способами. Классические школьные примеры - это сумма чисел от 1 до 10:
int sum = 0;
for (int i = 0; i <= 10; i++)
sum = sum + i;
Но вы также можете использовать его для суммирования чисел в массиве:
int[] anArr = new int[] { 1, 1, 2, 3, 5, 8, 13, 21 };
int sum = 0;
for (int i = 0; i < anArr.Length; i++)
sum = sum + anArr[i];
(это можно было бы сделать и с foreach):
int[] anArr = new int[] { 1, 1, 2, 3, 5, 8, 13, 21 };
int sum = 0;
foreach (int anInt in anArr)
sum = sum + anInt;
Но вы можете использовать его для суммы четных чисел от 1 до 10:
int sum = 0;
for (int i = 0; i <= 10; i = i + 2)
sum = sum + i;
И вы даже можете придумать какую-то сумасшедшую вещь, подобную этой:
int i = 65;
for (string s = string.Empty; s != "ABC"; s = s + Convert.ToChar(i++).ToString()) ;
Console.WriteLine(s);
для цикла:
1) need to specify the loop bounds( minimum or maximum).
2) executes a statement or a block of statements repeatedly
until a specified expression evaluates to false.
int K = 0;
for (int x = 1; x <= 9; x++){
k = k + x ;
}
оператор foreach:
1)do not need to specify the loop bounds minimum or maximum.
2)repeats a group of embedded statements for
a)each element in an array
or b) an object collection.
int k = 0;
int[] tempArr = new int[] { 0, 2, 3, 8, 17 };
foreach (int i in tempArr){
k = k + i ;
}
foreach почти эквивалентен:
var enumerator = list.GetEnumerator();
var element;
while(enumerator.MoveNext()){
element = enumerator.Current;
}
и для реализации шаблона, совместимого с foreach, необходимо предоставить класс, имеющий метод GetEnumerator(), который возвращает объект с MoveNext() метод, метод Reset() и свойство Current.
Действительно, вам не нужно реализовывать ни IEnumerable, ни IEnumerator.
Некоторые производные очки:
foreach
не нужно знать длину коллекции, поэтому позволяет выполнять итерацию по "потоку" или по типу "производителя элементов".foreach
вызывает виртуальные методы на итераторе (большую часть времени), поэтому может работать хуже, чем for
.foreach полезен, если у вас есть массив или другая коллекция данных, которая содержит IEnumerable. но для них можно использовать для элементов доступа массива, к которым можно получить доступ по их индексу.
А для цикла полезно, когда вы заранее указали или определили, сколько раз вы хотите запустить цикл. Например, если вам нужно выполнить процесс для каждого дня недели, вы знаете, что хотите 7 циклов.
Цикл foreach - это когда вы хотите повторить процесс для всех частей коллекции или массива, но не важно конкретно, сколько раз цикл работает. Например, вы форматируете список любимых книг для пользователей. У каждого пользователя может быть разное количество книг или нет, и нам все равно, сколько он есть, мы просто хотим, чтобы цикл работал на всех них.
Это зависит от того, что вы делаете и что вам нужно.
Если вы выполняете итерацию через набор элементов и не заботитесь о значениях индекса, то foreach более удобен, проще в написании и безопаснее: вы не можете ошибиться в количестве элементов.
Если вам нужно обрабатывать каждый второй элемент в коллекции, например, или обрабатывать их в обратном порядке, тогда цикл for является единственным практическим способом.
Самые большие различия заключаются в том, что цикл foreach обрабатывает экземпляр каждого элемента в коллекции по очереди, в то время как цикл for может работать с любыми данными и не ограничивается только элементами коллекции. Это означает, что цикл for может изменять коллекцию, которая является незаконной и приведет к ошибке в цикле foreach.
Основное различие между циклом for и foreach в С#, которое мы понимаем по его работе:
Цикл for:
Цикл foreach:
В случае цикла foreach переменная цикла while будет такой же, как тип значений в массиве.
Оператор Foreach повторяет группу встроенных операторов для каждого элемента массива или коллекции объектов.
В цикле foreach вам не нужно указывать минимальные или максимальные границы цикла.--- > здесь мы можем сказать, что это преимущество для каждого цикла.
простая разница между for и foreach
for loop is working with values.it must have condition then increment and intialization also.you have to knowledge about 'how many times loop repeated'.
foreach is working with objects and enumaretors. no need to knowledge how many times loop repeated.
Вы можете использовать foreach для простого массива, например
int[] test = { 0, 1, 2, 3, ...};
И вы можете использовать это, когда у вас есть 2D-массив
int[][] test = {{1,2,3,4},
{5,2,6,5,8}};
foreach выполняется быстро и просто. Синтаксис для немного сложнее, но также более гибкий.
foreach полезен при итерации всех элементов в коллекции. для полезен при итерации в целом или подмножестве элементов.
Итерационная переменная foreach, которая предоставляет каждый элемент коллекции, является READ-ONLY, поэтому мы не можем изменять элементы по мере их повторения. Используя синтаксис для, мы можем изменять элементы по мере необходимости.
Нижняя строка - используйте foreach, чтобы быстро перебрать все элементы в коллекции. Используйте для для итерации подмножества элементов коллекции или для изменения элементов по мере их повторения.
Я предпочитаю цикл с точки зрения производительности. Foreach немного медленный, когда вы идете с большим количеством элементов.
Например: я проверил с 1 lakhs предмет, и я мог видеть небольшую разницу в производительности.
Оператор foreach повторяет группу встроенных операторов для каждого элемента в массиве или коллекции объектов, которая реализует интерфейс System.Collections.IEnumerable или System.Collections.Generic.IEnumerable. Оператор foreach используется для итерации по коллекции для получения требуемой информации, но не может использоваться для добавления или удаления элементов из исходной коллекции, чтобы избежать непредсказуемых побочных эффектов. Если вам нужно добавить или удалить элементы из исходной коллекции, используйте цикл for.