[英]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.