Почему Enumerable не наследуется от IEnumerable <T> - PullRequest
3 голосов
/ 09 июня 2010

Я очень смущен этой проблемой и не могу ее понять. В документации Enumerable я прочитал это:

, которые реализуют System.Collections.Generic.IEnumerable

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

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

, но Enumerable не делает 't наследуется от IEnumerable<T> и IEnumerable<T> не содержит Select(), Where() и т. д. тоже ...

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

Ответы [ 6 ]

8 голосов
/ 09 июня 2010

Select (), Where () и т. Д. " методы расширения ".Их нужно определить «в другом месте», так как интерфейс не может обеспечить реализацию методов.

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

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

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

0 голосов
/ 11 марта 2016

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

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

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

0 голосов
/ 29 апреля 2014

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

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

0 голосов
/ 09 июня 2010

IEnumerable предшествовал IEnumerable<T>, то есть интерфейсу 2.0+.

0 голосов
/ 09 июня 2010

Correct.но как насчет этого предложения?

, которые реализуют System.Collections.Generic.IEnumerable

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

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

0 голосов
/ 09 июня 2010

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

...