2011-10-13 12 views
59

Tengo una clase que implementa IEnumerable, pero no implementa IEnumerable<T>. No puedo cambiar esta clase, y no puedo usar otra clase en lugar de esta. Como lo he entendido desde MSDN LINQ can be used if class implements IEnumerable<T>. Intenté usar instance.ToQueryable(), pero aún no habilita los métodos LINQ. Sé con certeza que esta clase puede contener instancias de un solo tipo, por lo que la clase podría implementar IEnumerable<T>, pero simplemente no lo hace. Entonces, ¿qué puedo hacer para consultar esta clase utilizando expresiones LINQ?¿LINQ funciona con IEnumerable?

+0

Sin poner en el IEnumerable, en lugar de los todos los métodos de LINQ sólo verá 8 métodos: AsQueryable , Cast <>, Equals, GetEnumerator, GetHashCode, GetType, OfType <>, ToString – ShawnFeatherly

Respuesta

101

Puede usar Cast<T>() o OfType<T> para obtener una versión genérica de un IEnumerable que sea totalmente compatible con LINQ.

Por ejemplo.

IEnumerable objects = ...; 
IEnumerable<string> strings = objects.Cast<string>(); 

O si usted no sabe qué tipo contiene siempre se puede hacer:

IEnumerable<object> e = objects.Cast<object>(); 

Si tu no genérico IEnumerable contiene objetos de varios tipos y que sólo están interesados ​​en, por ejemplo. las cadenas que pueden hacer:

IEnumerable<string> strings = objects.OfType<string>(); 
9

Sí, puede. Solo necesita usar la función Cast para hacer que se convierta a IEnumerable<T>. Por ejemplo

IEnumerable e = ...; 
IEnumreable<object> e2 = e.Cast<object>(); 

Ahora e2 es un IEnumerable<T> y puede trabajar con todas las funciones de LINQ.

3

También puede utilizar la sintaxis de LINQ comprensión de consulta, lo que arroja al tipo de la variable de rango (item en este ejemplo) si no se especifica un tipo:

IEnumerable list = new ArrayList { "dog", "cat" }; 

IEnumerable<string> result = 
    from string item in list 
    select item; 

foreach (string s in result) 
{ 
    // InvalidCastException at runtime if element is not a string 

    Console.WriteLine(s); 
} 

El efecto es idéntico a la solución de @JaredPar; vea 7.16.2.2: Tipos de variable de rango explícito en la especificación del lenguaje C# para más detalles.

-1

sí lo hace,

Te daré breve ejemplo para entender mejor

List<Student> obj = new List<Student>(); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 


     IEnumerable<Student> students = from x in obj.AsEnumerable() 
             select x; 


     foreach (var item in students) 
     { 
      MessageBox.Show(item.name); 
     } 



    class Student 
     { 
      public string name { get; set; } 
      public int roll { get; set; } 
      public string school { get; set; } 
     } 
+0

'List ' ya implementa 'IEnumerable ' que el OP especifica que su objeto no contiene. – MEMark

Cuestiones relacionadas