IList vs IEnumerable para colecciones en entidades

146

Cuando tengo entidades en mi dominio con listas de cosas, ¿deberían estar expuestas como ILists o IEnumerables? Por ejemplo, Order tiene un montón de OrderLines.

pondermático
fuente
¿Sería prudente implementar ambos?
PedroC88
44
No debería. Una IList hereda de IEnumerable.
Desconocido1987

Respuestas:

183

IEnumerable<T>representa una serie de elementos sobre los que puede iterar (usando foreach, por ejemplo), mientras que IList<T>es una colección que puede agregar o quitar.

Por lo general, querrá poder modificar un pedido agregando o quitando líneas de pedido, por lo que probablemente desee que Order.Lines sea un IList<OrderLine>.

Dicho esto, hay algunas decisiones de diseño de marco que debe tomar. Por ejemplo, ¿debería ser posible agregar la misma instancia de OrderLine a dos órdenes diferentes? Probablemente no. Por lo tanto, dado que querrá poder validar si una OrderLine debe agregarse a la orden, es posible que desee mostrar la propiedad Líneas solo como un IEnumerable<OrderLine>, y proporcionar los métodos Add (OrderLine) y Remove (OrderLine) que pueden manejar esa validación

Matt Hamilton
fuente
55
También puede usar una IReadOnlyListo IReadOnlyCollectionsi necesita que se materialice la lista pero no desea agregarla o eliminarla.
julealgon
Entonces IReadOnlyListno tiene sentido.
ajeh
24

La mayoría de las veces termino con IList sobre IEnumerable porque IEnumerable no tiene el método Count y no puede acceder a la colección a través de un índice (aunque si está utilizando LINQ puede solucionarlo con métodos de extensión).

JoshSchlesinger
fuente
1
Creo que siempre puede crear una instancia de una implementación IList con IEnumerable si necesita acceder al método de recuento y similares, por ejemplo: IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string> (enumerable ); Sin embargo, la forma en que exponga su colección debe depender de consideraciones tales como si desea que la propiedad de la colección sea inmutable (IEnumerable no le permitiría modificar la colección) o no (lea IList)
Sudhanshu Mishra
11
IEnumerable <T> .Count () comprueba si el tipo subyacente es una ICollection <T> que implementa una propiedad Count.
andleer
"no se puede acceder a la colección a través de un índice", ¿qué pasa con el ElementAtmétodo?
ivamax9