Bonjour à tous,
j'aimerai comprendre la portée de l'utilisation d'un "IEnumerable" plutôt qu'une liste banale "list".
Qu'est ce que ça entraîne d’utiliser l'un ou l'autre.
Merci de m'aider
Bonjour à tous,
j'aimerai comprendre la portée de l'utilisation d'un "IEnumerable" plutôt qu'une liste banale "list".
Qu'est ce que ça entraîne d’utiliser l'un ou l'autre.
Merci de m'aider
Salut,
List implémente IList qui implémente IEnumerable. Donc IEnumerable est plus abstrait ; IList expose des membres souvent utiles, comme Count, ou encore l'accès par indexeur (maList[index]).
Après ça dépend de ce que tu fais. Si tu as beaucoup de méthodes qui renvoient des collections en utilisant 'yield', tu vas préférer IEnumerable comme type de retour pour ne pas avoir à faire '.ToList()'. Si tu es constamment en train de tester le nombre d'éléments dans tes collections, tu vas préférer retourner des List. Après ça dépend aussi si tu utilises Linq...
l'utilisation n'est pas la même, sur IEnumarable tu ne peux pas faire .add
et il me semble qu'un IEnumerable n'exécute pas immédiatement ce qu'on lui dit de faire via du linq, mais seulement lors de la lecture
ce qui permettrait de faire des filtres multiples sans perte de performances (.where de linq etc...)
Tout à fait !
Ca en fait ça dépend du type de la collection concernée, IEnumerable étant une interface. Mais c'est vrai que ce tu dis est une utilisation fréquente de IEnumerable, d'où mon évocation de 'yield'.
En fait pour résumer on peut dire que comme son nom l'indique, IEnumerable définit les membres permettant d'énumérer une collection, pas de la manipuler (ni Add, ni Remove, etc). Avec Linq la plupart du temps on peut se contenter de signatures de méthodes retournant des IEnumerable, les extensions Linq prenant cette interface comme paramètre 'this'. Mais quand on stocke une collection dans un champ local, souvent on a besoin d'y ajouter/retirer des éléments, donc là on va déclarer directement avec le type sous-jacent, List ou autre, pour ne pas avoir à caster tout le temps.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 abstract class ClassDeBase<T> { public abstract IEnumerable<T> Collection { get; } } class EnProduction<T> : ClassDeBase<T> { private List<T> _data; ... ... public override IEnumerable<T> Collection { get { return this._data; } } } class Test<T> : ClassDeBase<T> where T : new() { public override IEnumerable<T> Collection { get { for(var i =0; i < 10; i++) { yield return new T(); } } } }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager