web-dev-qa-db-fra.com

IList vs IEnumerable pour les collections sur les entités

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

145
pondermatic

IEnumerable<T> représente une série d'éléments que vous pouvez parcourir (en utilisant foreach, par exemple), tandis que IList<T> 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 la supprimant, vous souhaiterez donc probablement que Order.Lines soit un 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 pouvoir valider si une ligne de commande doit être ajoutée à la commande, vous pouvez en effet vouloir faire apparaître la propriété Lines sous la forme uniquement d'un IEnumerable<OrderLine> et fournissez les méthodes Add (OrderLine) et Remove (OrderLine) qui peuvent gérer cette validation.

182
Matt Hamilton

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).

24
JoshSchlesinger