IList vs IEnumerable for Collections on Entities
当我的域中有实体具有事物列表时,它们应该作为IList或IEnumerable公开吗?例如,订单有一堆订单行。
- 实现这两个目标是明智的吗?
- 它不会。IList从IEnumerable继承。
IEnumerable表示一系列可以迭代的项(例如,使用foreach),而IList是可以添加到其中或从中删除的集合。
通常,您希望能够通过向订单添加或删除订单行来修改订单,因此您可能希望订单行是一个IList。
尽管如此,您应该做出一些框架设计决策。例如,是否可以将同一个订单行实例添加到两个不同的订单中?大概不会。因此,考虑到您希望能够验证是否应将医嘱行添加到订单中,您可能确实希望将Lines属性表示为仅IEnumerable,并提供可以处理该验证的添加(orderline)和删除(orderline)方法。
- 如果需要具体化列表但不想添加或删除,也可以使用IReadOnlyList或IReadOnlyCollection。
- 那么,IReadOnlyList就没有意义了。
大多数情况下,我最终使用的是IList而不是IEnumerable,因为IEnumerable没有count方法,并且您无法通过索引访问集合(尽管如果您使用的是LINQ,则可以使用扩展方法来解决此问题)。
- 我相信,如果需要访问Count方法等,您可以使用IEnumerable实例化一个IList实现,例如:IEnumerableEnumerable=ListMyList=New List(Enumerable);但是,公开集合的方式应该取决于是否需要集合属性不可变(IEnumerable不允许您修改集合)或不可变(read-ilist)
- IEnumerable.Count()检查基础类型是否为ICollection,它确实实现了Count属性。
- "您不能通过索引访问集合"-ElementAt方法怎么样?