Тип 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");
После этого набора операций переменной температура будет по-прежнему ссылаться только перечислимая с помощью одного элемента «Foo» в наборе значений в то время как элементы будут ссылаться на другие перечислимы со значениями «Foo» и «бар ».
EDIT
Я contstantly забывать, что Занести не типичный метод расширения на 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' предназначен только для запросов к коллекциям. Это основа для структуры LINQ. Это всегда абстракция какой-либо другой коллекции, такой как 'Collection ', 'Список ' или 'Array'. Интерфейс предоставляет только метод «GetEnumerator», который возвращает экземпляр «IEnumerator », который позволяет перемещать расширяющуюся коллекцию по одному элементу за раз. Методы расширения LINQ ограничены этим интерфейсом. 'IEnumerable ' предназначен для чтения только потому, что он может представлять собой агрегацию частей из нескольких коллекций. –
Jordan
В этом примере просто объявите 'IList' вместо 'IEnumerable ': 'IList items = new T [] {new T (" msg ")}; items.Add (новый T ("msg2")); ' –
NightOwl888