@ WingMan20-10: Bueno, eso cambia TODO. No se puede agregar a un genérico IEnumerable<T>. Tienes que usar algo como List<T>.
jason
1
En este caso, necesita una matriz concreta List <object> objs = new IEnumerable <object>. No puede agregar elementos a un iterador porque no es una colección ... es un iterador :)
user44298
1
@ivo: Tenga en cuenta que IEnumerable<T>no representa un iterador, representa una secuencia iterable . IEnumerator<T>en sí mismo representa el iterador.
Jon Skeet
Respuestas:
117
Por ejemplo, puede crear una instancia de List<object>, que implementa IEnumerable<object>. Ejemplo:
List<object> list = new List<object>();
list.Add(1);
list.Add(4);
list.Add(5);
IEnumerable<object> en = list;
CallFunction(en);
Dado que la pregunta muestra el uso de genéricos, dar un ejemplo de un tipo que no implementa el genérico IEnumerable<T>es una mala idea, en mi opinión.
Jon Skeet
Cualquier problema con el uso de CallFunction (list.AsEnumerable ()) en lugar de IEnumerable <object> en = list; ...
Gina Marano
Usaría una matriz con inicializador literal si es posible, es el tipo enumerable más eficiente y liviano disponible en .NET y no tiene la sobrecarga de List <>. Las listas solo deben usarse si realmente necesita o desea mutar después de la inicialización. Además, es mejor agregar System.Linq e invocar .AsEnumerable () en la matriz o lista.
Mark
33
Como ahora especificó que desea agregarle, lo que desea no es simple, IEnumerable<T>sino al menos un ICollection<T>. Recomiendo simplemente usar un List<T>como este:
Puede usar myList en cualquier lugar donde IEnumerable<object>se espere, ya que List<object>implements IEnumerable<object>.
(respuesta anterior antes de aclaración)
No puede crear una instancia de IEnumerable<T>ya que es una interfaz normal (a veces es posible especificar una implementación predeterminada, pero generalmente se usa solo con COM).
Entonces, lo que realmente desea es crear una instancia de una clase que implemente la interfazIEnumerable<T> . El comportamiento varía según la clase que elija.
Para un enumerable no vacío, puede usar alguna colección que implemente IEnumerable<T>. Las opciones comunes son la matriz T[], List<T>o si desea inmutabilidad ReadOnlyCollection<T>.
@AdamRalph: voté en contra y luego me distraí, así que no pude dejar un comentario de inmediato. Las interfaces son tipos, por lo que su respuesta es peligrosamente incorrecta porque propaga un error común.
jason
7
No, no puedes hacer eso. Utilice la siguiente línea de código en su lugar:
IEnumerable<int> usersIds = new List<int>() {1, 2, 3}.AsEnumerable();
Quería crear un nuevo objeto o lista enumerable y poder agregarlo.
Este comentario lo cambia todo. No se puede agregar a un genérico IEnumerable<T>. Si desea permanecer con las interfaces System.Collections.Generic, debe usar una clase que implemente ICollection<T>like List<T>.
La razón principal es que no podemos crear el objeto de una interfaz e IEnumerable es una interfaz . Necesitamos crear un objeto de la clase que implementa la interfaz. Esta es la razón principal por la que no podemos crear directamente un objeto de IEnumerable.
Creo que es posible especificar una implementación predeterminada que se instancia en lugar de la interfaz para interfaces COM.
CodesInChaos
@JonSkeet ¿no es más exacto decir que la llamada new SomeComInterface()crea una instancia del "CoClass" asociado a la interfaz en lugar de crear una instancia de la interfaz en sí?
phoog
@phoog: Eso sería exacto, pero lo importante y extraño es que puedes usarlo newcon una interfaz en ciertas situaciones.
Jon Skeet
0
Puedes hacerlo:
IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
IEnumerable<T>. Tienes que usar algo comoList<T>.IEnumerable<T>no representa un iterador, representa una secuencia iterable .IEnumerator<T>en sí mismo representa el iterador.Respuestas:
Por ejemplo, puede crear una instancia de
List<object>, que implementaIEnumerable<object>. Ejemplo:List<object> list = new List<object>(); list.Add(1); list.Add(4); list.Add(5); IEnumerable<object> en = list; CallFunction(en);fuente
IEnumerable<T>es una mala idea, en mi opinión.Como ahora especificó que desea agregarle, lo que desea no es simple,
IEnumerable<T>sino al menos unICollection<T>. Recomiendo simplemente usar unList<T>como este:List<object> myList=new List<object>(); myList.Add(1); myList.Add(2); myList.Add(3);Puede usar myList en cualquier lugar donde
IEnumerable<object>se espere, ya queList<object>implementsIEnumerable<object>.(respuesta anterior antes de aclaración)
No puede crear una instancia de
IEnumerable<T>ya que es una interfaz normal (a veces es posible especificar una implementación predeterminada, pero generalmente se usa solo con COM).Entonces, lo que realmente desea es crear una instancia de una clase que implemente la interfaz
IEnumerable<T>. El comportamiento varía según la clase que elija.Para una secuencia vacía use:
IEnumerable<object> e0=Enumerable.Empty<object>();Para un enumerable no vacío, puede usar alguna colección que implemente
IEnumerable<T>. Las opciones comunes son la matrizT[],List<T>o si desea inmutabilidadReadOnlyCollection<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});Otra forma común de implementar
IEnumerable<T>es la característica de iterador introducida en C # 3:IEnumerable<object> MyIterator() { yield return 1; yield return 2; yield return 3; } IEnumerable<object> e4=MyIterator();fuente
Otra solución sería utilizar
Empty.IEnumerable<object> a = Enumerable.Empty<object>();hay un hilo en SO al respecto: ¿Es mejor usar Enumerable.Empty () en lugar de la nueva Lista para inicializar un IEnumerable?
fuente
No, no puedes, ya que
IEnumerablees una interfaz.Debería poder crear una instancia vacía de la mayoría de los tipos que no son de interfaz que implementan
IEnumerable, por ejemplo: -IEnumerable<object> a = new object[] { };o
IEnumerable<object> a = new List<object>();fuente
No, no puedes hacer eso. Utilice la siguiente línea de código en su lugar:
IEnumerable<int> usersIds = new List<int>() {1, 2, 3}.AsEnumerable();Espero que ayude.
fuente
Este comentario lo cambia todo. No se puede agregar a un genérico
IEnumerable<T>. Si desea permanecer con las interfacesSystem.Collections.Generic, debe usar una clase que implementeICollection<T>likeList<T>.fuente
La razón principal es que no podemos crear el objeto de una interfaz e IEnumerable es una interfaz . Necesitamos crear un objeto de la clase que implementa la interfaz. Esta es la razón principal por la que no podemos crear directamente un objeto de IEnumerable.
fuente
No IEnumerable es una interfaz, no puede crear una instancia de interfaz
puedes hacer algo como esto
IEnumerable<object> a = new object[0];fuente
new SomeComInterface()crea una instancia del "CoClass" asociado a la interfaz en lugar de crear una instancia de la interfaz en sí?newcon una interfaz en ciertas situaciones.Puedes hacerlo:
IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable(); CallFunction(list);fuente