Конечно, с индексируемыми коллекциями вы можете использовать классический цикл for:
for( int i = 0; i < collection.Count; i++ )
{
collection[i] ... // do something with the item
}
Вы также можете напрямую получить доступ к объекту IEnumerator
(для которого foreach
является синтаксическим сахаром):
using( IEnumerator<YourType> e = collection.GetEnumerator() )
{
while( e.MoveNext() )
{
// do something with the item
e.Current ...
}
}
Все различные подходы для перечисления коллекции полезны в некоторых конкретных случаях - но это очень контекстуально относительно того, какой шаблон использовать, где.
Например, использование объекта IEnumerator
напрямую полезно, когда требуется точный контроль над тем, как и когда увеличивать и обращаться к итератору. Многие операторы LINQ внутренне используют IEnumerator
для оптимизации своей реализации.
Разумное правило: что при посещении предметов для создания побочных эффектов вы должны использовать for
или foreach
, когда преобразуете (проецируете) одну последовательность в другую Вы должны использовать LINQ (Выбрать, Где и т. д ...). Использование LINQ подчеркивает результат, скрывая механизм, тогда как циклы подчеркивают механизм.