IList vs IEnumerable für Sammlungen von Entitäten

146

Wenn ich Entitäten in meiner Domäne mit Listen von Dingen habe, sollten diese als ILists oder IEnumerables angezeigt werden? ZB hat Order eine Reihe von OrderLines.

pondermatisch
quelle
Wäre es sinnvoll, beides zu implementieren?
PedroC88
4
Es würde nicht. Eine IList erbt von IEnumerable.
Unbekannt1987

Antworten:

183

IEnumerable<T>stellt eine Reihe von Elementen dar, über die Sie iterieren können (z. B. mit foreach), während IList<T>es sich um eine Sammlung handelt, die Sie hinzufügen oder daraus entfernen können.

In der Regel möchten Sie in der Lage sein, eine Bestellung zu ändern, indem Sie OrderLines hinzufügen oder entfernen. Daher möchten Sie wahrscheinlich, dass Order.Lines eine ist IList<OrderLine>.

Allerdings sollten Sie einige Entscheidungen zum Framework-Design treffen. Sollte es beispielsweise möglich sein, dieselbe Instanz von OrderLine zu zwei verschiedenen Aufträgen hinzuzufügen? Wahrscheinlich nicht. Da Sie also überprüfen möchten, ob der Bestellung eine OrderLine hinzugefügt werden soll, möchten Sie die Lines-Eigenschaft möglicherweise nur als eine IEnumerable<OrderLine>anzeigen und die Methoden Add (OrderLine) und Remove (OrderLine) bereitstellen, die diese verarbeiten können diese Validierung.

Matt Hamilton
quelle
5
Sie können auch ein IReadOnlyListoder verwenden, IReadOnlyCollectionwenn die Liste materialisiert werden soll, Sie sie jedoch nicht hinzufügen oder daraus entfernen möchten.
Julealgon
Dann IReadOnlyListmacht es keinen Sinn.
Ajeh
24

Die meiste Zeit gehe ich mit IList über IEnumerable, weil IEnumerable nicht über die Count-Methode verfügt und Sie nicht über einen Index auf die Sammlung zugreifen können (obwohl Sie dies mit Erweiterungsmethoden umgehen können, wenn Sie LINQ verwenden).

JoshSchlesinger
quelle
1
Ich glaube, Sie können eine IList-Implementierung immer mit IEnumerable instanziieren, wenn Sie auf die Zählmethode und dergleichen zugreifen müssen, zum Beispiel: IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string> (enumerable) ); Wie Sie Ihre Sammlung verfügbar machen, sollte jedoch von Überlegungen abhängen, z. B. ob die Sammlungseigenschaft unveränderlich sein soll (IEnumerable erlaubt Ihnen nicht, die Sammlung zu ändern) oder nicht (IList lesen)
Sudhanshu Mishra
11
IEnumerable <T> .Count () prüft, ob der zugrunde liegende Typ eine ICollection <T> ist, die eine Count-Eigenschaft implementiert.
andleer
"Sie können nicht über einen Index auf die Sammlung zugreifen" - was ist mit der ElementAtMethode?
ivamax9