3 votes

Pourquoi Enumerable n'hérite pas de IEnumerable<T> ?

Je suis très confus à propos de cette question et je n'arrive pas à la comprendre. Enumerable Documentation, j'ai lu ceci :

qui mettent en œuvre System.Collections.Generic.IEnumerable

et certaines méthodes comme Select() retourner IEnumerable<TSource> que nous pouvons utiliser à partir d'autres méthodes comme Where() après l'avoir utilisé, par exemple :

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

mais Enumerable n'hérite pas de IEnumerable<T> et IEnumerable<T> ne contient pas Select() , Where() et autres aussi...

Ai-je tort ?
ou existe-t-il une raison à cela ?

8voto

Hans Kesting Points 17043

Les fonctions Select(), Where() etc. sont des " méthodes d'extension ". Elles doivent être définies "ailleurs" car une interface ne peut pas fournir une implémentation des méthodes.

Vous pouvez reconnaître les méthodes d'extension par le mot clé "this" dans la liste des arguments. Par exemple :

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

peut être utilisé comme s'il s'agissait d'une méthode sur un objet IEnumerable<TSource> avec un seul paramètre : Func<TSource, bool> predicate .

0voto

Novice Points 99

Correct. Mais qu'en est-il de cette phrase ?

qui mettent en œuvre System.Collections.Generic.IEnumerable

D'après cette phrase, nous devons définir des méthodes dans l'environnement de l'entreprise. IEnumerable<T> et l'implémenter dans l'interface Enumerable par héritage. Est-ce correct ?

pourquoi préférer les méthodes d'extension à l'héritage ?

0voto

Humberto Points 3872

IEnumerable est venu avant IEnumerable<T> qui est une interface 2.0+.

0voto

"pourquoi préférer les méthodes d'extension à l'héritage ?"

Enumerable est une classe statique qui implémente plus de 50 méthodes d'extension de IEnumerable. Cela vous permet d'utiliser toutes ces méthodes d'extension sur les types qui implémentent IEnumerable sans obliger les programmeurs à implémenter toutes ces méthodes pour chaque type de collection. Si Enumerable était une interface au lieu d'une classe statique, chaque type de collection (comme List, Dictionary, Set, etc.) aurait sa propre implémentation de ces méthodes d'extension.

0voto

Ghasan Points 553

Une façon de résoudre ce problème est d'attribuer le même type aux éléments en utilisant la méthode suivante Cast<T>() qui renvoie et IEnumerable<T> version des mêmes éléments.

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

Rows est de type IEnumerable et après le moulage, il devient de type IEnumerable<DataRow> qui est supporté par les méthodes d'extension LINQ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X