Преимущество перечислимых
Я изо всех сил пытаюсь понять выгоду IEnumerable. Я понимаю, что Enumerables позволяют отложить выполнение на потом.
Пожалуйста, посмотрите пример здесь: https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx. В этом примере массив уже заполняется в основном классе, а затем внедряется в класс IEnumerable. Следовательно, это, по-видимому, устраняет преимущество отсрочки выполнения до следующего. Что мне здесь не хватает?
4 ответа
Документация, на которую вы ссылаетесь, является просто способом ее реализации, а не наиболее эффективным способом. Конечно, показанная реализация вообще бесполезна, так как, как вы говорите, массив уже создан и перечисляем сам по себе.
Образец в лучшем случае полезен для демонстрации того, как пользовательский тип может действовать как коллекция, путем реализации IEnumerable
, Этот очень общий интерфейс, конечно, может использоваться для вызова из разных мест, где вам не нужны конкретные знания о типе коллекции, но это не показано в примере.
Перечислитель используется для перебора набора данных от начала до конца. Вы не можете прочитать предыдущий элемент обратно, так как он уже может быть удален (например, итератор, который должен загружать очень большие файлы из удаленного местоположения, может не захотеть их кэшировать).
Основное назначение IEnumerable
не откладывать выполнение на потом. Цель IEnumerable
это обеспечить способ перебора частей объекта. Эти части могут быть элементами списка, но они также могут быть (например) символами string
, IEnumerable
Интерфейс существует, потому что не каждый класс, который допускает итерации по его частям, является коллекцией или списком (таким как string
) а также IEnumerable
обеспечивает минимальный интерфейс для достижения этой цели без полной реализации ICollection
или же IList
,
Основным и наиболее важным потребителем IEnumerable
это foreach
заявление, которое существует с начала времен.NET. Только позже появился LINQ с Enumerable
класс, который также основан на IEnumerable
(или точнее на IEnumerable<T>
) интерфейс.
Говоря о LINQ, отложенное выполнение, на которое вы ссылаетесь в своем вопросе, действительно является ключевой особенностью LINQ. Это означает, что заданный вами запрос не выполняется до итерации IEnumerable
выполняется. Это позволяет вам еще более уточнить ваши запросы, прежде чем выполнять их.
Это отложенное выполнение, хотя относится только к тому, как IEnumerable
используется, а не то, что он делает. Отложенное выполнение означает, что вы не начнете перебирать IEnumerable
когда вы определяете его, но в другой точке программы, например foreach
, ToList
и т.п.
Одним из примеров IEnumerable является позднее выполнение.
Я считаю, что большим преимуществом использования IEnumerable являются:
Вы можете перебирать коллекцию, не зная, как перебирать ее (есть ли в коллекции индексатор? Как мне перебирать дерево? И т. Д.).
Вы можете перебрать часть коллекции - подумайте о поиске первого элемента, который соответствует вашему условию.
Позднее выполнение - вы можете фильтровать коллекции, и реальная фильтрация произойдет, как только вы пересечете свой IEnumerable (используя ForEach\ToList и т. Д.).
Это выбор проекта - отложить оценку или нет, но это не предписано IEnumerable. Некоторые выходные запросы Linq (например, Where & Select) откладывают оценку, другие коллекции, такие как Dictionary или List, не делают.
Вы должны использовать IEnumerable, когда единственная информация, которая вам нужна из коллекции, - это возможность "перечислить" элементы.
Допустим, вы хотите реализовать метод ToString для универсальной коллекции, где объект имеет свою собственную ToString. Если вы принимаете IEnumerable вместо массива, List или Set могут быть переданы в качестве аргумента без каких-либо изменений кода.