Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Collections 实体上集合的IList与IEnumerable_Collections_Ienumerable_Ilist - Fatal编程技术网

Collections 实体上集合的IList与IEnumerable

Collections 实体上集合的IList与IEnumerable,collections,ienumerable,ilist,Collections,Ienumerable,Ilist,当我的域中有实体和事物列表时,它们应该作为IList或IEnumerables公开吗?订单有一堆订单行 表示可以迭代的一系列项(例如,使用foreach),而是可以添加到或从中删除的集合 通常,您希望能够通过添加或删除订单行来修改订单,因此您可能希望Order.Lines是一个IList 话虽如此,您应该做出一些框架设计决策。例如,是否可以将同一个OrderLine实例添加到两个不同的订单中?可能不会。因此,考虑到您希望能够验证是否应将订单行添加到订单中,您可能确实希望将Lines属性显示为一个

当我的域中有实体和事物列表时,它们应该作为IList或IEnumerables公开吗?订单有一堆订单行

表示可以迭代的一系列项(例如,使用foreach),而是可以添加到或从中删除的集合

通常,您希望能够通过添加或删除订单行来修改订单,因此您可能希望Order.Lines是一个
IList


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

大多数情况下,我使用IList而不是IEnumerable,因为IEnumerable没有Count方法,并且您无法通过索引访问集合(尽管如果您使用LINQ,您可以通过扩展方法来解决这个问题)。

实现这两种方法是否明智?这不会。IList继承自IEnumerable。我相信如果您需要访问count方法等,您总是可以使用IEnumerable实例化IList实现,例如:IEnumerable enumerable=List myList=new List(enumerable);但是,公开集合的方式应取决于考虑因素,例如是否希望集合属性不可变(IEnumerable不允许修改集合)或不可变(read IList)IEnumerable.Count()检查基础类型是否为实现Count属性的ICollection。“您不能通过索引访问集合”-那么
ElementAt
方法呢?如果您需要具体化列表,但不想添加或删除列表,您也可以使用
IReadOnlyList
IReadOnlyCollection
。然后
IReadOnlyList
就没有意义了。