エンティティ上のコレクションのIListとIEnumerable


146

ドメインにエンティティのリストが存在する場合、それらをIListsまたはIEnumerableとして公開する必要がありますか?たとえば、Orderには多数のOrderLineがあります。


両方を実装するのが賢明でしょうか?
PedroC88

4
そうではありません。IListはIEnumerableから継承します。
Unknown1987

回答:


183

IEnumerable<T>(foreachなどを使用して)反復できる一連の項目を表しますが、IList<T>は追加または削除できるコレクションです。

通常、OrderLinesを追加または削除してOrderを変更できるようにしたいので、おそらくOrder.LinesをにしIList<OrderLine>ます。

そうは言っても、フレームワークの設計に関するいくつかの決定事項があります。たとえば、2つの異なる注文にOrderLineの同じインスタンスを追加することは可能でしょうか?おそらく違います。したがって、OrderLineを注文に追加する必要があるかどうかを検証できるようにする必要がある場合、Linesプロパティをとしてのみ表示しIEnumerable<OrderLine>、処理できるAdd(OrderLine)メソッドとRemove(OrderLine)メソッドを提供することができます。その検証。


5
IReadOnlyListまたはを使用することもできIReadOnlyCollectionます。リストを具体化する必要があるが、リストに追加または削除したくない場合。
julealgon 2015年

その後IReadOnlyList、意味がありません。
ajeh

24

IEnumerableにはCountメソッドがなく、インデックスを介してコレクションにアクセスできないため、ほとんどの場合、IEnumerableではなくIListを使用します(ただし、LINQを使用している場合は、拡張メソッドでこれを回避できます)。


1
countメソッドなどにアクセスする必要がある場合は、IEnumerableでIList実装をいつでもインスタンス化できると思います。例:IEnumerable <string> enumerable = <some-IEnumerable> List <string> myList = new List <string>(enumerable ); ただし、コレクションを公開する方法は、コレクションプロパティを不変にしたい(IEnumerableではコレクションを変更できない)かどうか(IListを読み取る)などの考慮事項に依存する必要があります
Sudhanshu Mishra

11
IEnumerable <T> .Count()は、基になる型がCountプロパティを実装するICollection <T>かどうかを確認します。
andleer 14

「インデックスを介してコレクションにアクセスすることはできません」- ElementAtメソッドはどうですか?
ivamax9 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.