实体集合的IList与IEnumerable


146

当我在自己的域中拥有包含事物列表的实体时,它们应该暴露为IList还是IEnumerables?例如,Order有很多OrderLines。


两者都明智吗?
PedroC88

4
不会的。一个IList继承自IEnumerable。
Unknown1987

Answers:


183

IEnumerable<T>表示您可以迭代的一系列项目(例如,使用foreach),而IList<T>可以添加或从中删除的集合。

通常,您希望能够通过向其添加或删除OrderLines来修改Order,因此您可能希望Order.Lines为IList<OrderLine>

话虽如此,您应该制定一些框架设计决策。例如,是否可以将相同的OrderLine实例添加到两个不同的订单?可能不是。因此,鉴于您希望能够验证是否应将OrderLine添加到订单中,您可能确实想将Lines属性仅显示为IEnumerable<OrderLine>,并提供可以处理的Add(OrderLine)和Remove(OrderLine)方法验证。


5
您也可以使用IReadOnlyList或,IReadOnlyCollection如果您需要实现列表,但又不想添加或删除列表。
julealgon

那就IReadOnlyList没有意义了。
ajeh

24

在大多数情况下,我最终都使用IEnumerable上的IList,因为IEnumerable没有Count方法,并且您无法通过索引访问集合(尽管如果您使用的是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()检查基础类型是否为ICollection <T>,它确实实现了Count属性。
andleer 2014年

“您无法通过索引访问集合”- ElementAt方法如何?
ivamax9
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.