IList vs IEnumerable dla kolekcji w jednostkach

146

Gdy mam jednostki w mojej domenie z listami rzeczy, czy powinny one być ujawniane jako ILists czy IEnumerables? Np. Order ma kilka OrderLines.

stawermatyczny
źródło
Czy mądrze byłoby wdrożyć oba?
PedroC88,
4
Nie byłoby. IList dziedziczy po IEnumerable.
Unknown1987

Odpowiedzi:

183

IEnumerable<T>reprezentuje serię elementów, które możesz iterować (na przykład używając foreach), podczas gdy IList<T>jest to kolekcja, do której możesz dodawać lub usuwać.

Zazwyczaj będziesz chciał móc modyfikować zamówienie, dodając lub usuwając do niego OrderLines, więc prawdopodobnie chcesz, aby Order.Lines był plikiem IList<OrderLine>.

Mimo to należy podjąć pewne decyzje dotyczące projektowania ram. Na przykład, czy powinno być możliwe dodanie tego samego wystąpienia OrderLine do dwóch różnych zamówień? Prawdopodobnie nie. Biorąc więc pod uwagę, że chcesz mieć możliwość sprawdzenia, czy OrderLine należy dodać do zamówienia, możesz rzeczywiście chcieć wyświetlić właściwość Lines jako jedyną IEnumerable<OrderLine>i udostępnić metody Add (OrderLine) i Remove (OrderLine), które mogą obsługiwać ta walidacja.

Matt Hamilton
źródło
5
Możesz również użyć IReadOnlyListlub, IReadOnlyCollectionjeśli potrzebujesz zmaterializowanej listy, ale nie chcesz jej dodawać ani usuwać.
julealgon
Wtedy IReadOnlyListnie ma sensu.
ajeh
24

W większości przypadków korzystam z IList przez IEnumerable, ponieważ IEnumerable nie ma metody Count i nie można uzyskać dostępu do kolekcji za pośrednictwem indeksu (chociaż jeśli używasz LINQ, możesz obejść to za pomocą metod rozszerzających).

JoshSchlesinger
źródło
1
Uważam, że zawsze można utworzyć wystąpienie implementacji IList z IEnumerable, jeśli potrzebujesz dostępu do metody count i tym podobnych, na przykład: IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string> (enumerable ); Jednak sposób, w jaki udostępniasz swoją kolekcję, powinien zależeć od czynników, takich jak to, czy chcesz, aby właściwość kolekcji była niezmienna (IEnumerable nie pozwoliłby ci modyfikować kolekcji), czy nie (czytaj IList)
Sudhanshu Mishra
11
IEnumerable <T> .Count () sprawdza, czy typem bazowym jest ICollection <T>, który implementuje właściwość Count.
andleer
„nie możesz uzyskać dostępu do kolekcji przez indeks” - a co z ElementAtmetodą?
ivamax9