2008-12-18 11 views

Respuesta

177

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

Normalmente, querrá poder modificar un pedido añadiendo o quitando OrderLines, por lo que probablemente desee que Order.Lines sea un IList<OrderLine>.

Habiendo dicho eso, hay algunas decisiones de diseño del 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 se debe agregar una OrderLine a la orden, es posible que desee visualizar la propiedad Lines como solo IEnumerable<OrderLine> y proporcionar los métodos Add (OrderLine) y Remove (OrderLine) que pueden manejar esa validación

+4

También puede usar un 'IReadOnlyList' o' IReadOnlyCollection' si necesita materializar la lista pero no desea agregarla o eliminarla. – julealgon

+0

Entonces 'IReadOnlyList' no tiene sentido. – ajeh

22

La mayor parte del tiempo termino yendo 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 evitar esto con la extensión métodos).

+1

creo que siempre se puede crear una instancia de una implementación de IList con el IEnumerable si necesita acceder al método de conteo y similares, por ejemplo: IEnumerable enumerables = Lista myList = nueva lista (numerable); Sin embargo, la forma en que expone su colección debe depender de consideraciones tales como si desea que la propiedad de colección sea inmutable (IEnumerable no le permite modificar la colección) o no (lea IList) – dotnetguy

+9

IEnumerable .Count() verificaciones ver si el tipo subyacente es un ICollection que implementa una propiedad Count. – andleer

+0

"no puede acceder a la colección a través de un índice": ¿qué ocurre con el método 'ElementAt'? – ivamax9