что такое IEnumerable в .NET

что такое IEnumerable в .NET?

67
задан Smi 11 January 2012 в 13:35
поделиться

4 ответа

Это ... что-то ..., что можно перебирать. Это может быть список, массив или (почти) все остальное, что поддерживает цикл foreach. Это нужно для тех случаев, когда вы хотите иметь возможность использовать объект в цикле foreach, но не знаете точно, с каким типом вы имеете дело, будь то Array, List или что-то другое.

Так что это первое преимущество: если ваши методы принимают IEnumerable, а не массив или список, они становятся более мощными, потому что вы можете передавать им больше различных типов объектов.

Теперь то, что действительно выделяет IEnumerable, - это блоки итераторов (ключевое слово yield в C#). Блоки итераторов реализуют интерфейс IEnumerable, как List или Array, но они очень особенные, потому что, в отличие от List или Array, они часто хранят состояние только для одного элемента за раз. Поэтому, например, если вы хотите перебрать строки очень большого файла, вы можете написать блок итератора для обработки ввода файла. Тогда в памяти одновременно не будет находиться более одной строки файла, и если вы завершите цикл раньше (возможно, это был поиск, и вы нашли то, что вам нужно), вам не понадобится читать весь файл. Или если вы читаете результаты большого SQL-запроса, вы можете ограничить использование памяти одной записью.

Еще одна особенность заключается в том, что эта оценка является ленивой, так что если вы выполняете сложную работу по оценке перечислимого по мере чтения из него, эта работа не будет выполняться, пока ее не попросят. Это очень полезно, потому что часто (например, при повторном поиске) вы обнаружите, что эта работа может вообще не понадобиться.

Вы можете думать об IEnumerable, как если бы это был только что созданный List.

67
ответ дан 24 November 2019 в 14:38
поделиться

Короткий ответ: это все, для чего можно использовать foreach.

7
ответ дан 24 November 2019 в 14:38
поделиться

Это интерфейс, реализуемый типами Collection в .NET, которые обеспечивают модель итератора. Существует также общая версия, которая представляет собой IEnumerable.

Синтаксис (который вы редко видите, потому что есть более красивые способы сделать это) для перемещения по коллекции, реализующей IEnumerable, следующий:

IEnumerator enumerator = collection.GetEnumerator();

while(enumerator.MoveNext())
{
    object obj = enumerator.Current;
    // work with the object
}

Что функционально эквивалентно:

foreach(object obj in collection)
{
    // work with the object
}

Если коллекция поддерживает индексаторы, вы также можете выполнять итерацию по ней с помощью классического метода цикла for, но паттерн Iterator предоставляет некоторые приятные дополнительные возможности, например, возможность добавить синхронизацию для работы с потоками.

34
ответ дан 24 November 2019 в 14:38
поделиться

Во-первых, это интерфейс. Определение согласно MSDN :

Предоставляет перечислитель, который поддерживает простая итерация по неуниверсальному коллекция.

Очень просто сказано, что любой объект, реализующий этот интерфейс, предоставит способ получить перечислитель. Перечислитель используется с foreach в качестве одного из примеров.

Список реализует интерфейс IEnumerable.

    // This is a collection that eventually we will use an Enumertor to loop through
    // rather than a typical index number if we used a for loop.
    List<string> dinosaurs = new List<string>();

    dinosaurs.Add("Tyrannosaurus");
    dinosaurs.Add("Amargasaurus");
    dinosaurs.Add("Mamenchisaurus");
    dinosaurs.Add("Deinonychus");
    dinosaurs.Add("Compsognathus");

    Console.WriteLine();

    // HERE is where the Enumerator is gotten from the List<string> object
    foreach(string dinosaur in dinosaurs)
    {
        Console.WriteLine(dinosaur);
    }

    // You could do a 
    for(int i = 0; i < dinosaurs.Count; i++)
    {
        string dinosaur = dinosaurs[i];

        Console.WriteLine(dinosaur);
    }

Foreach выглядит чище.

12
ответ дан 24 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: