Як прокрутити колекцію, яка підтримує IEnumerable?


Відповіді:


155

Звичайний для кожного буде робити:

foreach (var item in collection)
{
    // do your stuff   
}

Це швидше, ніж .ElementAt (). На жаль, мій голос заблокований у відповіді Alexa, тому я не можу скасувати це, але це найкраща відповідь. +1
Лео Гардіан

То як ви тоді виправляєте "Можливе багаторазове перерахування IEnumerable"?
SharpC

1
@SharpC: найпростіший спосіб - витягнути результат у List <T> або масив, а потім передати його різним місцям, які потрібно переглядати. Це гарантує, що (потенційно дороге) перерахування результату відбувається лише один раз, але ціною збереження результату в пам'яті. Моїм першим кроком було б з’ясувати, чи насправді багаторазове перерахування є проблемою чи ні.
Фредрік Морк,

94

Поряд із уже запропонованими методами використання foreachциклу, я думав також згадати, що будь-який об'єкт, який реалізує, IEnumerableтакож надає IEnumeratorінтерфейс через GetEnumeratorметод. Хоча цей метод, як правило, не потрібний, його можна використовувати для ітерації вручну по колекціях, і він особливо корисний при написанні власних методів розширення для колекцій.

IEnumerable<T> mySequence;
using (var sequenceEnum = mySequence.GetEnumerator())
{
    while (sequenceEnum.MoveNext())
    {
        // Do something with sequenceEnum.Current.
    }
}

Яскравий приклад - це коли потрібно повторити дві послідовності одночасно , що неможливо за допомогою foreachциклу.


7
Не забудьте розпорядитися перелічувачем.
Ерік Ліпперт

@Eric: Так, я додаю це, тому що це легко пропустити.
Noldorin

1
Я думаю, що це буде працювати лише для IEnumerable <T> об'єктів, а не для IEnumerable. У мене був загальний випадок, коли мені доводилося застосовувати IEnumerable, і, отже, у мене не було доступного методу GetEnumerator. У будь-якому випадку приємно для більшості випадків.
Фабіо Мілхейро,

50

або навіть дуже класичний метод старої моди

IEnumerable<string> collection = new List<string>() { "a", "b", "c" };

for(int i = 0; i < collection.Count(); i++) 
{
    string str1 = collection.ElementAt(i);
    // do your stuff   
}

можливо, вам би сподобався і цей метод :-)


9
Чому тут так багато голосів? Це перерахує численні 2n рази замість одного разу.
Роман Рейнер

1
@RomanReiner, оскільки це працює, деякі люди не турбуються про виступ :)
Khateeb321,

@RomanReiner це хороший приклад, мені потрібно призначити кожен елемент однієї колекції іншій колекції, я думаю, що я не можу зробити це, використовуючи foreach
AminM

1
Якщо ви подивитесь на реалізацію ElementAt, то виявите, що якщо колекція є IList, вони повертають елемент за індексом за допомогою []; настільки ж продуктивність, що і [], однак; якщо ні, вони отримають Enumerator і розпочнуть ітерацію, послідовно шукаючи елемент, перш ніж повернути його, тому в основному для кожного елемента вони створюють новий перелічувач і знову переміщаються по списку ...
Ізраїль Гарсія,

1
Гірше за все це, IEnumerable не підтримує Count () або ElementAt (). Я думаю, що він думає про Ілліста. Це насправді взагалі не відповідає на питання.
krowe


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.