繁体   English   中英

为什么不IEnumerable <T> 实现Add(T)?

[英]Why doesn't IEnumerable<T> implement Add(T)?

刚刚发现它,Add(T)在ICollection<T>定义,而不是IEnumerable<T> Enumerable.cs中的扩展方法不包含Add(T),我认为这很奇怪。 由于对象是可枚举的,因此它必须“看起来像”一组项目。 谁能告诉我为什么?

IEnumerable<T>只是一系列元素; 将其视为仅向前游标。 因为很多这些序列正在从数据库生成值,数据流或记录集,所以向它们Add项是没有意义的。

IEnumerable用于阅读,而不是用于写作。

可枚举就是这样 - 你可以枚举并发现所有项目。 这并不意味着您可以添加它。

能够枚举对于许多类型的对象是通用的。 例如,它由数组和集合共享。 但是你不能在没有弄乱它的结构的情况下“添加”数组 - 而集合是专门为了添加和删除而构建的。

从技术上讲,你可以通过使用Concat<>来“添加”一个枚举,但是所有这一切都是创建一个枚举器,枚举从一个可枚举到下一个 - 给出一个单一的可以设置的错觉。

每个ICollection应该是IEnumerable (我认为,.NET Framework团队似乎同意我;-)),但反过来并不总是有意义。 在这个世界中存在“像对象一样的集合”的层次结构,并且您假设可枚举将是可以添加项目的集合在该层次结构中不成立。

示例:主要颜色名称列表将是IEnumerable返回"Red""Blue""Green" 在这样填充的“集合”上执行primaryColors.Add("Bright Purple")根本没有逻辑意义:

...whatever...
{
    ...
    var primaryColors = EnumeratePrimaryColors();
    ...
}

private static IEnumerable<string> EnumeratePrimaryColors() {
    yield return "Red";
    yield return "Blue";
    yield return "Green";
}

正如其名称所示,您可以枚举(循环)IEnumerable,这就是它。 当你想能够添加一些东西时,它不再只是一个可枚举,因为它有额外的功能。

例如,数组是IEnumerable,但数组具有固定长度,因此您无法向其中添加新项。

IEnumerable只是所有类型集合的“基础”(甚至只读集合 - 显然没有Add()方法)。 您添加到这种“基本界面”的功能越多,它就越具体。

这个名字说明了一切。 IEnumerable仅用于枚举项目。 ICollection是项目的实际集合,因此支持Add方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM