что такое IEnumerable в .net - PullRequest
67 голосов
/ 10 июня 2010

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

Ответы [ 4 ]

67 голосов
/ 10 июня 2010

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

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

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

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

Вы можете думать о IEnumerable, как если бы он был простоСписок времени.

34 голосов
/ 10 июня 2010

Это интерфейс, реализованный типами Collection в .NET, которые предоставляют шаблон Iterator . Там также общая версия, которая IEnumerable<T>.

Синтаксис (который вы редко видите, потому что есть более красивые способы сделать это) для перемещения по коллекции, которая реализует 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 loop, но шаблон Iterator предоставляет некоторые приятные дополнения, такие как возможность добавить синхронизацию для потоков.

12 голосов
/ 10 июня 2010

Сначала это интерфейс.Определение в соответствии с 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 выглядит чище.

7 голосов
/ 10 июня 2010

Короткий ответ: все, что вы можете использовать foreach вкл.

...