Тип 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".
EDIT
Я безперечно забуваю, що 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>
призначений для читання лише тому, що він може представляти собою сукупність частин декількох колекцій.