IEnumerable <object> a = new IEnumerable <object> (); Posso fazer isso?


90

Eu quero criar uma nova instância de um objeto IEnumerable<object>

Posso fazer isso?

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


1
Não, e nem mesmo faz sentido.
CodesInChaos

3
@ WingMan20-10: Bem, isso muda TUDO. Você não pode adicionar a um genérico IEnumerable<T>. Você tem que usar algo parecido List<T>.
jason

1
Neste caso, você precisa de um array concreto List <object> objs = new IEnumerable <object>. Você não pode adicionar itens a um iterador porque não é uma coleção ... é um iterador :)
user44298

1
@ivo: Observe que IEnumerable<T>não representa um iterador - ele representa uma sequência iterável . IEnumerator<T>em si representa o iterador.
Jon Skeet

Respostas:


114

Você pode, por exemplo, criar uma instância de List<object>, que implementa IEnumerable<object>. Exemplo:

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

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

11
Dado que a questão mostra o uso de genéricos, dar um exemplo de um tipo que não implementa o genérico IEnumerable<T>é uma má ideia da IMO.
Jon Skeet

Qualquer problema com o uso de CallFunction (list.AsEnumerable ()) em vez de IEnumerable <object> en = list; ...
Gina Marano

Eu usaria uma matriz com inicializador literal se possível, é o tipo enumerável mais eficiente e leve disponível no .NET e não tem a sobrecarga de um List <>. As listas só devem ser usadas se você realmente precisar ou quiser sofrer mutação após a inicialização. Além disso, é melhor adicionar System.Linq e invocar .AsEnumerable () na matriz ou lista.
Marcar

33

Como agora você especificou que deseja adicionar a ele, o que você deseja não é simples, IEnumerable<T>mas pelo menos um ICollection<T>. Eu recomendo simplesmente usar um List<T>como este:

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

Você pode usar myList em qualquer lugar onde um IEnumerable<object>seja esperado, desde List<object>implementa IEnumerable<object>.

(resposta antiga antes do esclarecimento)

Você não pode criar uma instância de, IEnumerable<T>pois é uma interface normal (às vezes é possível especificar uma implementação padrão, mas isso geralmente é usado apenas com COM).

Portanto, o que você realmente deseja é instanciar uma classe que implemente a interface IEnumerable<T> . O comportamento varia dependendo da classe que você escolher.

Para uma sequência vazia, use:

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

Para um enumerável não vazio, você pode usar alguma coleção que implemente IEnumerable<T>. As escolhas comuns são o array T[], List<T>ou se você quiser imutabilidade 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});

Outra maneira comum de implementar IEnumerable<T>é o recurso iterador introduzido em C # 3:

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

IEnumerable<object> e4=MyIterator();


24

Não, você não pode, pois IEnumerableé uma interface.

Você deve ser capaz de criar uma instância vazia da maioria dos tipos de não interface que implementam IEnumerable, por exemplo: -

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

ou

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

@AdamRalph: Eu votei negativamente e depois me distraí, então não pude deixar um comentário imediatamente. Interfaces são tipos, portanto, sua resposta está perigosamente errada porque propaga um equívoco comum.
jason

7

Não, você não pode fazer isso. Use a seguinte linha de código:

IEnumerable<int> usersIds = new List<int>() {1, 2, 3}.AsEnumerable();

Espero que ajude.


1

Eu queria criar um novo objeto ou lista enumerável e ser capaz de adicionar a ele.

Este comentário muda tudo. Você não pode adicionar a um genérico IEnumerable<T>. Se você quiser ficar com as interfaces em System.Collections.Generic, precisará usar uma classe que implemente ICollection<T>like List<T>.


1

O principal motivo é que não podemos criar um objeto de uma interface, e IEnumerable é uma interface . Precisamos criar o objeto da classe que implementa a interface. Este é o principal motivo pelo qual não podemos criar diretamente o objeto de IEnumerable.


0

Nenhum IEnumerable é uma interface, você não pode criar uma instância de interface

você pode fazer algo assim

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

É possível criar uma instância de interface COM como essa @Jon Skeet?
Arsen Mkrtchyan


1
Acho que é possível especificar uma implementação padrão que é instanciada em vez da interface para interfaces COM.
CodesInChaos

@JonSkeet não é mais correto dizer que a chamada new SomeComInterface()instancia a "CoClass" associada da interface em vez de instanciar a própria interface?
phoog de

@phoog: Isso seria correto - mas o mais importante e estranho é que você pode usar newcom uma interface em certas situações.
Jon Skeet

0

Você consegue fazer isso:

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.