我应该返回IEnumerable还是IList?

时间:2010-07-05 15:29:26

标签: c# collections ienumerable

我希望从方法中返回一个有序的项目列表。我的返回类型应该是IEnumerable还是IList?

7 个答案:

答案 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的ContainsElementAt扩展方法对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属性。