IList vs IEnumerable per le raccolte su entità


146

Quando ho entità nel mio dominio con elenchi di cose, dovrebbero essere esposte come ILists o IEnumerables? Ad esempio, Order ha un sacco di OrderLines.


Sarebbe saggio implementare entrambi?
PedroC88,

4
Non lo sarebbe. Un IList eredita da IEnumerable.
Unknown1987

Risposte:


183

IEnumerable<T>rappresenta una serie di elementi su cui è possibile scorrere (ad esempio utilizzando foreach), mentre IList<T>è una raccolta che è possibile aggiungere o rimuovere.

In genere vorrai essere in grado di modificare un Ordine aggiungendo o rimuovendo OrderLines ad esso, quindi probabilmente vuoi che Order.Lines sia un IList<OrderLine>.

Detto questo, ci sono alcune decisioni di progettazione del framework che dovresti prendere. Ad esempio, dovrebbe essere possibile aggiungere la stessa istanza di OrderLine a due ordini diversi? Probabilmente no. Quindi, dato che vorrai essere in grado di convalidare se un OrderLine debba essere aggiunto all'ordine, potresti effettivamente voler mostrare la proprietà Lines come solo un IEnumerable<OrderLine>, e fornire i metodi Add (OrderLine) e Remove (OrderLine) che possono gestire quella convalida.


5
Puoi anche usare un IReadOnlyListo IReadOnlyCollectionse hai bisogno dell'elenco materializzato ma non vuoi aggiungerlo o rimuoverlo.
julealgon,

Quindi IReadOnlyListnon ha senso.
ajeh

24

Il più delle volte finisco con IList su IEnumerable perché IEnumerable non ha il metodo Count e non puoi accedere alla raccolta tramite un indice (anche se se stai usando LINQ puoi aggirare questo problema con i metodi di estensione).


1
Credo che sia sempre possibile creare un'istanza di un'implementazione IList con IEnumerable se è necessario accedere al metodo count e simili, ad esempio: IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string> (enumerable ); Tuttavia, il modo in cui esponi la tua collezione dovrebbe dipendere da considerazioni come se desideri che la proprietà della raccolta sia immutabile (IEnumerable non ti consentirebbe di modificare la raccolta) oppure no (leggi IList)
Sudhanshu Mishra il

11
IEnumerable <T> .Count () verifica se il tipo sottostante è un ICollection <T> che implementa una proprietà Count.
Andleer,

"non puoi accedere alla raccolta tramite un indice" - che dire del ElementAtmetodo?
Ivamax9,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.