该类型IEnumerable<T>
不支持此类操作。该IEnumerable<T>
界面的目的是允许消费者查看集合的内容。不修改值。
当您执行诸如.ToList()。Add()之类的操作时,您将创建一个新List<T>
值并将一个值添加到该列表。它与原始列表没有连接。
您可以使用添加扩展方法创建IEnumerable<T>
具有附加值的新商品。
items = items.Add("msg2");
即使在这种情况下,它也不会修改原始IEnumerable<T>
对象。可以通过持有对它的引用来验证。例如
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
在这组操作之后,变量temp将仍然仅引用值集中的单个元素“ foo”的可枚举,而项将引用值“ foo”和“ bar”的不同的枚举。
编辑
我一直忘记,Add不是典型的扩展方法,IEnumerable<T>
因为它是我最终定义的第一个方法。这里是
public static IEnumerable<T> Add<T>(this IEnumerable<T> e, T value) {
foreach ( var cur in e) {
yield return cur;
}
yield return value;
}
IEnumerable<T>
仅用于查询集合。它是LINQ框架的骨干。它始终是一些其他的集合,如的抽象Collection<T>
,List<T>
或Array
。该接口仅提供一种GetEnumerator
方法,该方法返回一个实例,IEnumerator<T>
该实例一次使扩展集合的遍历成为可能。LINQ扩展方法受此接口限制。IEnumerable<T>
被设计为只读,因为它可能表示多个集合的各个部分的集合。