IList vs IEnumerable dla kolekcji w jednostkach


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.


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).


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.