2008-12-18 24 views

Répondre

177

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 un ordre en y ajoutant ou en supprimant des lignes de commande. Par conséquent, vous souhaiterez probablement que les lignes de commande soient IList<OrderLine>. Cela dit, il y a certaines décisions de conception de cadre que vous devriez prendre. Par exemple, devrait-il être possible d'ajouter la même instance de OrderLine à deux ordres différents? Probablement pas. Donc, étant donné que vous voudrez être en mesure de valider si un OrderLine doit être ajouté à la commande, vous voudrez peut-être faire apparaître la propriété Lines comme un IEnumerable<OrderLine>, et fournir des méthodes Add (OrderLine) et Remove (OrderLine) qui peuvent gérer cette validation.

+4

Vous pouvez également utiliser 'IReadOnlyList' ou' IReadOnlyCollection' si vous avez besoin que la liste soit matérialisée, mais vous ne voulez pas l'ajouter ou la retirer. – julealgon

+0

Ensuite, "IReadOnlyList" n'a aucun sens. – ajeh

22

La plupart du temps, je termine avec 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 l'extension méthodes).

+1

Je crois que vous pouvez toujours instancier une implémentation IList avec le IEnumerable si vous avez besoin d'accéder à la méthode de comptage et comme par exemple: IEnumerable dénombrable = Liste myList = new Liste (dénombrable); Toutefois, la manière dont vous exposez votre collection dépend de considérations telles que si vous souhaitez que la propriété de collection soit immuable (IEnumerable ne vous permet pas de modifier la collection) ou non (lisez IList) – dotnetguy

+9

IEnumerable .Count() vérifie si voir si le type sous-jacent est une ICollection qui implémente une propriété Count. – andleer

+0

"vous ne pouvez pas accéder à la collection via un index" - qu'en est-il de la méthode 'ElementAt'? – ivamax9