IEnumerable <объект> a = новый IEnumerable <объект> (); Я могу сделать это?


95

Я хочу создать новый экземпляр объекта IEnumerable<object>

Я могу сделать это?

IEnumerable<object> a = new IEnumerable<object>();


1
Нет, и это даже не имеет смысла.
— CodesInChaos 05

3
@ WingMan20-10: Что ж, это меняет ВСЕ. Вы не можете добавить к общему IEnumerable<T>. Вы должны использовать что-то вроде List<T>.
— Джейсон 05

1
В этом случае вам понадобится конкретный массив List <object> objs = new IEnumerable <object>. Вы не можете добавлять элементы в итератор, потому что это не коллекция ... это итератор :)
— user44298 05

1
@ivo: Обратите внимание, что IEnumerable<T>это не итератор, а повторяющаяся последовательность. IEnumerator<T>сам представляет собой итератор.
— Джон Скит

Ответы:


117

Например, вы можете создать экземпляр List<object>, который реализует IEnumerable<object>. Пример:

List<object> list = new List<object>();
list.Add(1);
list.Add(4);
list.Add(5);

IEnumerable<object> en = list;
CallFunction(en);

11
Учитывая, что в вопросе показано использование дженериков, учитывая пример типа, который не реализует универсальный IEnumerable<T>, это плохая идея, ИМО.
— Джон Скит

Любая проблема с использованием CallFunction (list.AsEnumerable ()) вместо IEnumerable <object> en = list; ...
— Джина Марано

Если возможно, я бы использовал массив с буквальным инициализатором, это наиболее эффективный и легкий перечислимый тип, доступный в .NET, и он не имеет накладных расходов, связанных с List <>. Списки следует использовать только в том случае, если вам действительно нужно или вы хотите изменить их после инициализации. Кроме того, лучше добавить System.Linq и вызвать .AsEnumerable () в массиве или списке.
— Марк

33

Поскольку теперь вы указали, что хотите добавить к нему, то, что вам нужно, не просто, IEnumerable<T>а, по крайней мере, файл ICollection<T>. Я рекомендую просто использовать List<T>вот так:

List<object> myList=new List<object>();
myList.Add(1);
myList.Add(2);
myList.Add(3);

Вы можете использовать MyList везде IEnumerable<object>ожидается, так как List<object>орудия IEnumerable<object>.

(старый ответ до уточнения)

Вы не можете создать экземпляр, IEnumerable<T>поскольку это обычный интерфейс (иногда можно указать реализацию по умолчанию, но обычно она используется только с COM).

Итак, что вам действительно нужно, так это создать экземпляр класса , реализующего интерфейс IEnumerable<T> . Поведение варьируется в зависимости от того, какой класс вы выбираете.

Для пустой последовательности используйте:

IEnumerable<object> e0=Enumerable.Empty<object>();

Для непустого перечислимого вы можете использовать некоторую коллекцию, которая реализует IEnumerable<T>. Распространенные варианты массив T[], List<T>или если вы хотите неизменность ReadOnlyCollection<T>.

IEnumerable<object> e1=new object[]{1,2,3};
IEnumerable<object> e2=new List<object>(){1,2,3};
IEnumerable<object> e3=new ReadOnlyCollection(new object[]{1,2,3});

Другой распространенный способ реализации IEnumerable<T>- функция итератора, представленная в C # 3:

IEnumerable<object> MyIterator()
{
  yield return 1;
  yield return 2;
  yield return 3;
}

IEnumerable<object> e4=MyIterator();


24

Нет, нельзя, поскольку IEnumerableэто интерфейс.

Вы должны иметь возможность создать пустой экземпляр большинства неинтерфейсных типов, которые реализуют IEnumerable, например: -

IEnumerable<object> a = new object[] { };

или

IEnumerable<object> a = new List<object>();

@AdamRalph: Я проголосовал против, а потом отвлекся, поэтому не мог сразу оставить комментарий. Интерфейсы - это типы, поэтому ваш ответ опасно неверен, потому что он распространяет распространенное заблуждение.
— Джейсон 05


1

Я хотел создать новый перечислимый объект или список и иметь возможность добавлять к нему.

Этот комментарий меняет все. Вы не можете добавить к общему IEnumerable<T>. Если вы хотите остаться с интерфейсами System.Collections.Generic, вам нужно использовать класс, который реализует ICollection<T>подобные List<T>.


1

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


0

Нет IEnumerable - это интерфейс, вы не можете создать экземпляр интерфейса

ты можешь сделать что-то вроде этого

IEnumerable<object> a = new object[0];

Можно ли создать такой экземпляр COM-интерфейса @Jon Skeet?
— Арсен Мкртчян


1
Я думаю, что можно указать реализацию по умолчанию, которая создается вместо интерфейса для COM-интерфейсов.
— CodesInChaos 05

@JonSkeet, не будет ли точнее сказать, что вызов new SomeComInterface()создает экземпляр связанного с интерфейсом "CoClass", а не сам интерфейс?
— phoog

@phoog: Это было бы правильно, но важно и странно то, что вы можете использовать newинтерфейс в определенных ситуациях.
— Джон Скит,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.