Просто случайно найдите его, Add (T) определен в ICollection
вместо IEnumerable
. А методы расширения в Enumerable.cs не содержат Add (T), что, на мой взгляд, очень странно. Поскольку объект перечислим, он должен «выглядеть» как коллекция элементов. Может кто-нибудь сказать мне, почему?
An IEnumerable
— это просто последовательность элементов; видеть его как курсор только вперед. Поскольку многие из этих последовательностей генерируют значения, потоки данных или наборы записей из базы данных, нет смысла добавлять
к ним элементы.
Перечислимое - это именно то, что вы можете перечислить и обнаружить все элементы. Это не означает, что вы можете добавить к нему.
Возможность перечисления универсальна для многих типов объектов. Например, он является общим для массивов и коллекций. Но вы не можете «добавить» массив, не возившись с его структурой, тогда как Коллекция специально создана для добавления и удаления.
Технически вы можете «добавить» к перечислимому, однако — с помощью Concat<>
— однако все, что это делает, это создает перечислитель, который перечисляет от одного перечисляемого к другому — создавая иллюзию одного смежный набор.
Как следует из названия, вы можете выполнять перечисление (цикл) по IEnumerable, и это все. Если вы хотите иметь возможность что-то добавить к нему, это больше не будет просто перечисляемым, поскольку у него есть дополнительные функции.
Например, массив представляет собой IEnumerable, но массив имеет фиксированную длину, поэтому в него нельзя добавлять новые элементы.
IEnumerable — это просто «база» для всех видов коллекций (даже для коллекций только для чтения, у которых, очевидно, нет метода Add()). Чем больше функциональности вы добавите в такой «базовый интерфейс», тем более конкретным он будет.
Название говорит само за себя. IEnumerable предназначен только для перечисления элементов. ICollection — это фактическая коллекция элементов, поэтому поддерживается метод Add.
IEnumerable
предназначен для чтения, а не для записи.
Каждая ICollection
должна быть IEnumerable
(я думаю, и команда .NET Framework, кажется, согласна со мной ;-)), но другой обходной путь не всегда имеет смысл. В этом мире существует иерархия «коллекции, подобной объектам», и ваше предположение, что перечисляемое будет коллекцией, в которую вы можете добавлять элементы, не соответствует действительности в этой иерархии.
Пример: список названий основных цветов будет представлять собой IEnumerable
, возвращающий "Красный"
, "Синий"
и "Зеленый"
. ]. Было бы совершенно нелогично иметь возможность выполнить primaryColors.Add("Bright Purple")
для "коллекции", заполненной следующим образом:
...whatever...
{
...
var primaryColors = EnumeratePrimaryColors();
...
}
private static IEnumerable<string> EnumeratePrimaryColors() {
yield return "Red";
yield return "Blue";
yield return "Green";
}