Почему IEnumerable не реализует Add (T)?

Просто случайно найдите его, Add (T) определен в ICollection вместо IEnumerable . А методы расширения в Enumerable.cs не содержат Add (T), что, на мой взгляд, очень странно. Поскольку объект перечислим, он должен «выглядеть» как коллекция элементов. Может кто-нибудь сказать мне, почему?

12
задан Cheng Chen 27 August 2010 в 08:00
поделиться

6 ответов

An IEnumerable — это просто последовательность элементов; видеть его как курсор только вперед. Поскольку многие из этих последовательностей генерируют значения, потоки данных или наборы записей из базы данных, нет смысла добавлять к ним элементы.

48
ответ дан 2 December 2019 в 02:52
поделиться

Перечислимое - это именно то, что вы можете перечислить и обнаружить все элементы. Это не означает, что вы можете добавить к нему.

Возможность перечисления универсальна для многих типов объектов. Например, он является общим для массивов и коллекций. Но вы не можете «добавить» массив, не возившись с его структурой, тогда как Коллекция специально создана для добавления и удаления.

Технически вы можете «добавить» к перечислимому, однако — с помощью Concat<> — однако все, что это делает, это создает перечислитель, который перечисляет от одного перечисляемого к другому — создавая иллюзию одного смежный набор.

10
ответ дан 2 December 2019 в 02:52
поделиться

Как следует из названия, вы можете выполнять перечисление (цикл) по IEnumerable, и это все. Если вы хотите иметь возможность что-то добавить к нему, это больше не будет просто перечисляемым, поскольку у него есть дополнительные функции.

Например, массив представляет собой IEnumerable, но массив имеет фиксированную длину, поэтому в него нельзя добавлять новые элементы.

IEnumerable — это просто «база» для всех видов коллекций (даже для коллекций только для чтения, у которых, очевидно, нет метода Add()). Чем больше функциональности вы добавите в такой «базовый интерфейс», тем более конкретным он будет.

2
ответ дан 2 December 2019 в 02:52
поделиться

Название говорит само за себя. IEnumerable предназначен только для перечисления элементов. ICollection — это фактическая коллекция элементов, поэтому поддерживается метод Add.

2
ответ дан 2 December 2019 в 02:52
поделиться

IEnumerable предназначен для чтения, а не для записи.

11
ответ дан 2 December 2019 в 02:52
поделиться

Каждая 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";
}
3
ответ дан 2 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: