C# 为什么';t IEnumerable<;T>;实施Add(T)?

C# 为什么';t IEnumerable<;T>;实施Add(T)?,c#,.net,generics,collections,ienumerable,C#,.net,Generics,Collections,Ienumerable,刚才偶然发现,Add(T)是在ICollection中定义的,而不是IEnumerable。Enumerable.cs中的扩展方法不包含Add(t),我觉得这很奇怪。因为对象是可枚举的,所以它必须“看起来”像一组项。有人能告诉我为什么吗?IEnumerable是用来读的,不是用来写的。正如它的名字所说,你可以在IEnumerable上枚举(循环),就是这样。 当您希望能够向它添加一些内容时,它将不再只是一个可枚举的,因为它有额外的特性 例如,数组是IEnumerable,但数组具有固定长度,因此

刚才偶然发现,Add(T)是在
ICollection
中定义的,而不是
IEnumerable
。Enumerable.cs中的扩展方法不包含Add(t),我觉得这很奇怪。因为对象是可枚举的,所以它必须“看起来”像一组项。有人能告诉我为什么吗?

IEnumerable是用来读的,不是用来写的。

正如它的名字所说,你可以在IEnumerable上枚举(循环),就是这样。 当您希望能够向它添加一些内容时,它将不再只是一个可枚举的,因为它有额外的特性

例如,数组是IEnumerable,但数组具有固定长度,因此不能向其中添加新项

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

一个
IEnumerable
只是一系列元素;将其视为仅向前的光标。由于这些序列中有很多都是从数据库生成值、数据流或记录集,因此向它们添加项是没有意义的。

可枚举项正是这样的—您可以枚举并发现所有项。这并不意味着你可以增加它

能够枚举对许多类型的对象都是通用的。例如,它由数组和集合共享。但是,如果不弄乱数组的结构,就不能“添加”到数组中,而集合是专门为添加和删除而构建的


但是,从技术上讲,您可以使用Concat“添加”到一个可枚举项中,但这只是创建一个从一个可枚举项到下一个可枚举项的枚举数,给人一种单一连续集合的错觉。

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

每个
ICollection
都应该是
IEnumerable
(我认为,.NET Framework团队似乎同意我的观点;-),但另一种方法并不总是有意义的。在这个世界上有一个“类似于集合的对象”的层次结构,您认为可枚举对象是可以向其中添加项的集合的假设在该层次结构中并不成立

示例:原色名称列表将是一个
IEnumerable
,返回
“红色”
“蓝色”
“绿色”
。在这样一个“集合”中添加(“亮紫色”),完全没有逻辑意义:

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

private static IEnumerable<string> EnumeratePrimaryColors() {
    yield return "Red";
    yield return "Blue";
    yield return "Green";
}
…随便什么。。。
{
...
var primaryColors=EnumeratePrimaryColors();
...
}
私有静态IEnumerable Enumerative PrimaryColor(){
收益率返回“红色”;
收益率返回“蓝色”;
收益率回报率“绿色”;
}

+1用于使用单词序列,因为IEnumerable正是这样,而不是某种集合。
ICollection
继承自
IEnumerable
,而
ICollection
继承自
IEnumerable
(继承自
IEnumerable
)。换句话说,你是对的:每个
i集合
都是一个
IEnumerable
。如果
IEnumerable
需要
Add
来实现,那么反过来就会有更多的问题:为什么
IEnumerable
Add
。这种方式非常有用:)