IList vs IEnumerable pour les collections sur les entités


146

Lorsque j'ai des entités dans mon domaine avec des listes de choses, doivent-elles être exposées en tant que ILists ou IEnumerables? Par exemple, Order a un tas de OrderLines.


Serait-il sage de mettre en œuvre les deux?
PedroC88

4
Ce ne serait pas le cas. Un IList hérite de IEnumerable.
Unknown1987

Réponses:


183

IEnumerable<T>représente une série d'éléments sur lesquels vous pouvez parcourir (en utilisant foreach, par exemple), alors que IList<T>c'est une collection que vous pouvez ajouter ou supprimer.

En règle générale, vous souhaiterez pouvoir modifier une commande en y ajoutant ou en supprimant OrderLines, vous souhaiterez donc probablement que Order.Lines soit un fichier IList<OrderLine>.

Cela dit, vous devez prendre certaines décisions de conception de cadre. Par exemple, devrait-il être possible d'ajouter la même instance de OrderLine à deux commandes différentes? Probablement pas. Donc, étant donné que vous voudrez être en mesure de valider si une OrderLine doit être ajoutée à la commande, vous pouvez en effet vouloir faire apparaître la propriété Lines comme uniquement un IEnumerable<OrderLine>, et fournir des méthodes Add (OrderLine) et Remove (OrderLine) qui peuvent gérer cette validation.


5
Vous pouvez également utiliser un IReadOnlyListou IReadOnlyCollectionsi vous avez besoin que la liste soit matérialisée mais que vous ne voulez pas en ajouter ou en supprimer.
julealgon

Cela IReadOnlyListn'a alors aucun sens.
ajeh

24

La plupart du temps, je finis par utiliser IList sur IEnumerable car IEnumerable n'a pas la méthode Count et vous ne pouvez pas accéder à la collection via un index (bien que si vous utilisez LINQ, vous pouvez contourner cela avec des méthodes d'extension).


1
Je crois que vous pouvez toujours instancier une implémentation IList avec IEnumerable si vous devez accéder à la méthode count et autres, par exemple: IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string> (enumerable ); Cependant, la façon dont vous exposez votre collection doit dépendre de considérations telles que si vous voulez que la propriété de la collection soit immuable (IEnumerable ne vous permettrait pas de modifier la collection) ou non (lisez IList)
Sudhanshu Mishra

11
IEnumerable <T> .Count () vérifie si le type sous-jacent est un ICollection <T> qui implémente une propriété Count.
andleer

"vous ne pouvez pas accéder à la collection via un index" - qu'en est-il de la ElementAtméthode?
ivamax9
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.