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