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.

pondermatique
la source
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.

Matt Hamilton
la source
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).

JoshSchlesinger
la source
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