Вопрос

Я очень запутался по этому вопросу и не могу этого понять. Enumerable Документация, я прочитал это:

Это реализует System.Collions.generic.gienableable

и некоторые методы, такие как Select() вернуть IEnumerable<TSource> что мы можем использовать из других методов, таких как Where() После использования этого. Для примера:

names.Select(name => name).Where(name => name.Length > 3 );

но Enumerable не наследует от IEnumerable<T> а также IEnumerable<T> не содержит Select(),Where() И и т. Д. тоже ...

я не прав?
Или существует каких-либо причин для этого?

Это было полезно?

Решение

Выбор (), где () и т. Д.Методы расширения«. Они должны быть определены« в другом месте », так как интерфейс не может предоставить реализацию методов.

Вы можете распознать методы расширения по ключевому слову «это» в списке аргументов. Например:

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)

можно использовать как если это метод на IEnumerable<TSource> С одним параметром: Func<TSource, bool> predicate.

Другие советы

Исправить. Но как насчет этого предложения?

Это реализует System.Collions.generic.gienableable

Согласно этому предложению, мы должны определить методы в IEnumerable<T> Интерфейс и внедрение в Enumerable класс по наследству. Это правильно?

Почему предпочтительные методы расширения против наследства?

Ienumerable пришел раньше IEnumerable<T>, который является интерфейсом 2.0+.

«Почему предпочтительные методы расширения против наследства?»

Перечислимый - это статический класс, который реализует более 50 методов расширения для IENumerable. Это позволяет вам использовать все эти методы расширения на типах, которые реализуют IEnumerable, не заставляя программистов реализовать все эти методы для каждого типа коллекции. Если перечислимы были интерфейсом вместо статического класса, каждый тип коллекции (такой как список, словарь, набор и т. Д.) будет иметь собственную реализацию этих методов расширения.

Способ решения этого - лить элементы в их же тип, используя Cast<T>() метод, который возвращает и IEnumerable<T> Версия тех же элементов.

DataTable dt = ...
dt.Rows.Cast<DataRow>().Where()...

Rows имеет тип IEnumerable, и после литья его становится типом IEnumerable<DataRow>, который поддерживается методами расширения LINQ.

Я сказал, что у вас также есть читать по этой статье Итераторы, итераторы блоки и трубопроводы данных Jon Skeet для дальнейшего понимания

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top