IList vs IEnumerable para coleções em entidades

146

Quando tenho entidades no meu domínio com listas de coisas, elas devem ser expostas como ILists ou IEnumerables? Por exemplo, Order possui um monte de OrderLines.

pondermatic
fonte
Seria sensato implementar ambos?
PedroC88
4
Não seria. Um IList herda de IEnumerable.
precisa

Respostas:

183

IEnumerable<T>representa uma série de itens sobre os quais você pode iterar (usando o foreach, por exemplo), enquanto que IList<T>é uma coleção à qual você pode adicionar ou remover.

Normalmente, você deseja modificar um Pedido adicionando ou removendo OrderLines, e provavelmente deseja que Order.Lines seja um IList<OrderLine>.

Dito isto, existem algumas decisões de design de estrutura que você deve tomar. Por exemplo, deveria ser possível adicionar a mesma instância do OrderLine a dois pedidos diferentes? Provavelmente não. Portanto, considerando que você deseja validar se um OrderLine deve ser adicionado ao pedido, você pode realmente apresentar a propriedade Lines como apenas um IEnumerable<OrderLine>e fornecer os métodos Add (OrderLine) e Remove (OrderLine) que podem manipular essa validação.

Matt Hamilton
fonte
5
Você também pode usar uma IReadOnlyListou IReadOnlyCollectionse precisar da lista materializada, mas não deseja adicionar ou remover dela.
julealgon
Então IReadOnlyListnão faz sentido.
22418 Ajeh
24

Na maioria das vezes, acabo indo com IList sobre IEnumerable porque IEnumerable não possui o método Count e você não pode acessar a coleção por meio de um índice (embora, se você estiver usando o LINQ, possa contornar isso com métodos de extensão).

JoshSchlesinger
fonte
1
Eu acredito que você sempre pode instanciar uma implementação IList com o IEnumerable se precisar acessar o método count e similares, por exemplo: IEnumerable <string> enumerable = <some-IEnumerable> Lista <string> myList = new List <string> (enumerável ); No entanto, como você expõe sua coleção deve depender de considerações como se você deseja que a propriedade da coleção seja imutável (IEnumerable não permitirá que você modifique a coleção) ou não (leia IList)
Sudhanshu Mishra
11
IEnumerable <T> .Count () verifica se o tipo subjacente é um ICollection <T> que implementa uma propriedade Count.
andleer
"você não pode acessar a coleção através de um índice" - e o ElementAtmétodo?
Olamax9