Тип IEnumerable<T>
не поддерживает такие операции. Назначение IEnumerable<T>
интерфейса - позволить потребителю просматривать содержимое коллекции. Не изменять значения.
Когда вы выполняете такие операции, как .ToList (). Add (), вы создаете новый List<T>
и добавляете значение в этот список. Это не имеет никакого отношения к первоначальному списку.
Что вы можете сделать, это использовать метод Add extension, чтобы создать новый 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>
предназначен только для чтения, поскольку может представлять собой совокупность частей нескольких коллекций.