我应该返回一个IEnumerable或IList?

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

这里有一个层次结构:

interface IList<T> : ICollection<T> { } interface ICollection<T> : IEnumerable<T> { } 

你想要尽可能less的耦合,所以返回一个IEnumerable<T>就足够了。 它可能会。

如果情况要求调用者获得一个可用于添加/插入/删除的List,则返回一个IList<T> 。 但即使如此,如果调用者从IEnumerable集合创build了自己的List,情况可能会更好。

这取决于你想要做的结果。 如果你需要得到物品的数量或随机访问个别物品,请与IList联系。

如果调用者只是想遍历这些项目,然后去IEnumerable – 但你应该logging是否将返回的值将被评估懒惰或许多IEnumerable实例这些天代表查询将在集合枚举时执行。 为了安全起见,如果你回来的东西不会按需求评估,我会和IList一起去。

它很容易,如果调用者只能使用它,只能使用IEnumerable。 因为这也支持协方差(结果可以被转换为基本types)

一般来说,最好是返回IEnumerable<T> ,只要这个函数具有调用者所需的所有东西。

IEnumerable<T>是可用的,这是许多消费者所需要的。 它也是只读的,这通常是一件好事 – 这意味着有时可以通过返回实际的后备集合进行优化,而不必担心有人在不告诉你的情况下修改它。

但是,如果消费者需要的方法不在IEnumerable<T> ,那么IList<T>可能更有意义。 例如,调用者可能想要调用不在IEnumerable<T>上的Contains 。 或者调用者可能想索引到列表中,而不是从开始到结束迭代。

但是你也可以通过LINQ的Contains和ElementAt扩展方法在IEnumerable<T>上做Contains和索引。 所以这里有一个学位的问题。 如果调用者只需要问一个在IEnumerable<T>上不可用的问题,如“is this empty”,那么返回一个IEnumerable<T>并使用Any扩展方法。 但是,如果调用者广泛使用IList<T>操作,则返回IList<T>

如果你想返回一个有序列表,也许你应该返回一个SortedList。

http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx

您可以将订单与对象关联起来。

IEnumerable不如IList具体,也就是说,IList具有IEnumerable不具备的function。

比较两者,看看你有没有需要的function。

IList有改变项目的方法(比如Add),也许你想在ICollection和IEnumerable之间进行select。

ICollection扩展IEnumerable并具有可用的Count属性。