何时返回IEnumerable <t> </t>

时间:2012-02-07 09:23:28

标签: c# .net collections ienumerable

我是否应仅在延迟评估的情况下从方法和属性返回IEnumerable<T>

当您返回IEnumerableICollectionIList时,您是否有任何模式?

5 个答案:

答案 0 :(得分:4)

每当调用者只需要从头到尾遍历集合时,我就会返回IEnumerable。通过使用最小可能的接口,我确保调用代码不会过于紧密耦合,从而使以后更容易更改方法或属性中的代码。如果它仍然返回IEnumerable,则没有其他人需要关心。如果它之前返回List并且new方法在内部表示使用HashSet的东西,那么很多其他东西也必须改变。

因此,我总是喜欢返回集合接口而不是具体的集合,除非调用代码确实需要知道它正在处理什么类型的集合。我考虑调用者需要做的操作,并找到支持它们的最小接口。

答案 1 :(得分:3)

通常如果它是一个列表(不是懒惰)我会返回IList。比如说,当我的方法希望将结果作为集合返回时,我会一直这样做。 我这样做是因为它在方法签名中明确指出它是一个加载列表,而不是惰性求值列表,但是使用接口不会暴露具体类型(数组,列表,只读列表等)。

当我对传入的集合进行任何类型的转换时,我返回IEnumerable(LINQ方法)

同时我在我的方法中使用IEnumerable作为参数只是为了声明“这个函数不关心,它只需要能够通过”。当然,我确保在我的函数中只枚举IEnumerable一次。

答案 2 :(得分:2)

如果结果只能为您方法的调用者读取,则返回IEnumerable<T>

答案 3 :(得分:2)

在这些情况下应该返回

IEnumerable<T>

  1. 如果结果是数组,列表或任何类型的集合,则结果无关紧要,因为消费者需要迭代它

  2. 使用IEnumerable<T>的实现键入结果,但公共API不会强制消费者使用特定于API的类型,因此消费者使用POCO保持中立。

    < / LI>

    如果结果应该是一个集合,则应返回IEnumerable<T>ICollection<T>IList<T>List<T>IList<T>的具体实现。消费者应该能够使用索引器访问可枚举成员,或者他们应该修改集合本身(添加,更新,删除,搜索集合中的项目)

    在输入属性和返回类型时选择正确的具体结果更多是关于良好的案例分析,只需键入消费者需要的内容即可。

    例如,从概念上讲,某些属性应该返回列表,但是消费者不应该修改它,因此,此属性应返回ReadOnlyCollection<T>,但您要键入它为{{1}}。

    如上所述,良好的案例分析和保持简单

答案 4 :(得分:1)

根据经验:

如果我确定我总是知道我返回的结果数量,则返回ICollection。如果调用者只是枚举,他们可以轻松地将其视为IEnumerable。如果元素的顺序不是随机的,我使用IList。我在其他情况下使用IEnumerable。对于一个接口的不同实现,我使用“最松散”的接口而不是重新复制结果以满足特定的集合接口。