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


90

Voglio creare una nuova istanza di un oggetto IEnumerable<object>

Posso farlo?

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


1
No, e non ha nemmeno senso.
CodesInChaos

3
@ WingMan20-10: Beh, questo cambia TUTTO. Non puoi aggiungere a un generico IEnumerable<T>. Devi usare qualcosa di simile List<T>.
jason

1
In questo caso è necessario un array concreto List <object> objs = new IEnumerable <object>. Non puoi aggiungere elementi a un iteratore perché non è una raccolta ... è un iteratore :)
user44298

1
@ivo: nota che IEnumerable<T>non rappresenta un iteratore - rappresenta una sequenza iterabile . IEnumerator<T>esso stesso rappresenta l'iteratore.
Jon Skeet

Risposte:


114

Ad esempio, puoi creare un'istanza di List<object>, che implementa IEnumerable<object>. Esempio:

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

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

11
Dato che la domanda mostra l'uso di generici, dato un esempio di un tipo che non implementa il generico IEnumerable<T>è una cattiva idea IMO.
Jon Skeet

Qualsiasi problema con l'utilizzo di CallFunction (list.AsEnumerable ()) invece di IEnumerable <object> en = list; ...
Gina Marano

Se possibile, userei un array con un inizializzatore letterale, è il tipo enumerabile più efficiente e leggero disponibile in .NET e non ha l'overhead di un List <>. Gli elenchi dovrebbero essere usati solo se hai davvero bisogno o vuoi cambiare dopo l'inizializzazione. Inoltre, è meglio aggiungere System.Linq e richiamare .AsEnumerable () sull'array o sull'elenco.
Mark

33

Dato che ora hai specificato che vuoi aggiungere ad esso, quello che vuoi non è un semplice IEnumerable<T>ma almeno un file ICollection<T>. Consiglio semplicemente di usare un List<T>come questo:

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

Puoi usare myList ovunque IEnumerable<object>sia previsto, poiché List<object>implementa IEnumerable<object>.

(vecchia risposta prima del chiarimento)

Non è possibile creare un'istanza di IEnumerable<T>poiché si tratta di un'interfaccia normale (a volte è possibile specificare un'implementazione predefinita, ma di solito viene utilizzata solo con COM).

Quindi quello che vuoi veramente è creare un'istanza di una classe che implementa l' interfaccia IEnumerable<T> . Il comportamento varia a seconda della classe scelta.

Per una sequenza vuota utilizzare:

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

Per un enumerabile non vuoto è possibile utilizzare una raccolta che implementa IEnumerable<T>. Le scelte comuni sono l'array T[], List<T>o se vuoi l'immutabilità 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});

Un altro modo comune di implementazione IEnumerable<T>è la funzionalità iteratore introdotta in C # 3:

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

IEnumerable<object> e4=MyIterator();


24

No, non puoi perché IEnumerableè un'interfaccia.

Dovresti essere in grado di creare un'istanza vuota della maggior parte dei tipi non di interfaccia che implementano IEnumerable, ad esempio: -

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

o

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

@AdamRalph: ho downvotato e poi mi sono distratto, quindi non ho potuto lasciare un commento immediatamente. Le interfacce sono tipi, quindi la tua risposta è pericolosamente sbagliata perché propaga un malinteso comune.
jason

7

No, non puoi farlo. Utilizza invece la seguente riga di codice:

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

Spero possa essere d'aiuto.


1

Volevo creare un nuovo oggetto o elenco enumerabile ed essere in grado di aggiungervi.

Questo commento cambia tutto. Non puoi aggiungere a un generico IEnumerable<T>. Se vuoi rimanere con le interfacce in System.Collections.Generic, devi usare una classe che implementa ICollection<T>come List<T>.


1

Il motivo principale è che non possiamo creare un oggetto di un'interfaccia e IEnumerable è un'interfaccia . Dobbiamo creare l'oggetto della classe che implementa l'interfaccia. Questo è il motivo principale per cui non possiamo creare direttamente un oggetto di IEnumerable.


0

No IEnumerable è un'interfaccia, non è possibile creare istanze di interfaccia

puoi fare qualcosa di simile

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

È possibile creare istanze dell'interfaccia COM come quella @ Jon Skeet?
Arsen Mkrtchyan


1
Penso che sia possibile specificare un'implementazione predefinita che viene istanziata al posto dell'interfaccia per le interfacce COM.
CodesInChaos

@JonSkeet non è più accurato dire che la chiamata new SomeComInterface()istanzia la "CoClass" associata all'interfaccia piuttosto che istanziare l'interfaccia stessa?
phoog

@phoog: sarebbe accurato, ma la cosa importante e strana è che puoi usarla newcon un'interfaccia in determinate situazioni.
Jon Skeet

0

Puoi farlo:

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.