我希望从方法中返回一个有序的项目列表。我的返回类型应该是IEnumerable还是IList?
答案 0 :(得分:41)
这里有一个层次结构:
interface IList<T> : ICollection<T> { }
interface ICollection<T> : IEnumerable<T> { }
您希望以尽可能少的耦合为目标,因此如果足够,请返回IEnumerable<T>
。它可能会。
如果情况需要调用者获得可用于添加/插入/删除的List,则返回IList<T>
。但即便如此,如果调用者从IEnumerable集合创建自己的List也可能会更好。
答案 1 :(得分:13)
这取决于你想要对结果做什么。如果您需要获取项目数或随机访问单个项目,请使用IList。
如果调用者只想迭代这些项目,那么请使用IEnumerable - ,但是你应该记录是否会延迟评估返回的值 - 这些天的许多IEnumerable实例代表了枚举集合时执行。为了安全起见,如果您要归还的内容不会按需评估,我会选择IList。
答案 2 :(得分:5)
很简单, 如果调用者只应使用Readonly,请使用IEnumerable。 因为这也支持协方差(结果可以转换为基类型)
答案 3 :(得分:4)
通常情况下,最好返回IEnumerable<T>
,只要它具有调用者需要的所有内容。
IEnumerable<T>
是可以预见的,这是许多消费者所需要的。它也是只读的,这通常是一件好事 - 这意味着你有时可以通过返回实际的后备集合进行优化,而不必担心有人在不告诉你的情况下修改它。
但是,如果消费者需要的方法不在IEnumerable<T>
上,那么IList<T>
可能会更有意义。例如,来电者可能想要拨打不在Contains
的{{1}}。或者调用者可能想要索引到列表中,而不是从头到尾迭代它。
但是你也可以通过LINQ的Contains和ElementAt扩展方法对IEnumerable<T>
进行包含和索引。所以这里有一个学位问题。如果来电者只需要提问IEnumerable<T>
上没有的一个问题,例如“这是空的”,那么请返回IEnumerable<T>
并使用Any扩展方法。但如果调用者广泛使用IEnumerable<T>
个操作,请返回IList<T>
。
答案 4 :(得分:3)
如果要返回有序列表,可能应返回SortedList。
http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx
您可以将订单与对象相关联。
答案 5 :(得分:2)
IEnumerable不像IList那样具体,也就是说,IList具有IEnumerable没有的功能。
比较两者,看看是否有一个你需要的功能而另一个没有。
答案 6 :(得分:2)
IList有更改项目的方法(如Add),也许你想在ICollection和IEnumerable之间进行选择。
ICollection扩展了IEnumerable并且具有可用的Count属性。