【发布时间】:2016-02-18 16:49:44
【问题描述】:
我在寻找我的问题的解决方案时最终进入了this 帖子 - 这导致我在那里提出了一个新的答案 - 并且 - 面临以下问题:
考虑到 ICollection 实现 IEnumerable,并且所有 linq 扩展都适用于这两个接口,是否有任何情况下我可以从使用 IEnumerable 而不是 ICollection 中受益?
例如,非通用IEnumerable 不提供Count 扩展。
ICollection 接口都可以。
鉴于所有ICollection,无论如何,提供IEnumerable 实现的所有功能——因为它本身实现了它——那我为什么要选择IEnumerable 来代替ICollection?
向后兼容以前没有ICollection 的框架?
【问题讨论】:
-
IEnumerable是ICollection的父接口。所以如果你的方法只接受ICollection<T>,它就不像接受IEnumerable<T>那样可重用。另请注意,许多 LINQ 扩展方法尝试强制转换为IList或ICollection以使用属性而不是枚举序列。Enumerable.Count已优化,如您所见 here。 -
@TimSchmelter:谢谢蒂姆。声明 因此,如果您说您的方法仅采用 ICollection
它不像您采用 IEnumerable 那样可重用但是确实回答“为什么不使用 A 而不是 B,如果A 是 B+”。如果在任何情况下 IEnumerable 被更广泛地使用 - 这仍然不是不使用 ICollection 的原因,因为 ICollection 是一个 IEnumerable(除非上述内容是错误的)。 -
@Veverke 除非有特殊原因不这样做,否则您应该始终更喜欢层次结构中具有您需要的更高级别。这提供了更大的灵活性:如果
ICollection中没有您需要的特定内容,则使用IEnumerable可以提供更大的灵活性。 -
@Jcl:我同意,这是一个强项。然而,正如我对蒂姆上述声明之一的评论一样——我仍然认为这本身并没有回答这个问题。另一方面,下面 Luk 的回答带来了 IEnumerable 优于 ICollection 的功能。 IEnumerable 可能在任何地方都更频繁 - 但如果我不关心可移植性,那么它甚至不会触及问题的重点。
-
@Veverke
IEnumerable没有ICollection的任何功能。因为它是一个更简单的合约,如果有的话,它有 less 的特性:ICollection拥有IEnumerable所拥有的一切(它实现了IEnumerable),然后还有更多的东西。另外,我真的不明白可移植性与这一切有什么关系。我认为您要么在这里混合了一些东西,要么我根本不了解您。
标签: c# linq ienumerable icollection