.net - getenumerator - ¿LINQ funciona con IEnumerable?
foreach list linq (4)
Puede usar Cast<T>()
o OfType<T>
para obtener una versión genérica de un IEnumerable que sea totalmente compatible con LINQ.
P.ej.
IEnumerable objects = ...;
IEnumerable<string> strings = objects.Cast<string>();
O si no sabe qué tipo contiene, siempre puede hacer:
IEnumerable<object> e = objects.Cast<object>();
Si su IEnumerable
no genérico contiene objetos de varios tipos y usted solo está interesado en, por ejemplo. las cuerdas que puedes hacer:
IEnumerable<string> strings = objects.OfType<string>();
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 entendí de MSDN, LINQ se puede usar si la clase implementa IEnumerable<T>
. He intentado 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?
Sí lo hace,
Te daré un breve ejemplo para que te entienda 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; }
}
Sí puede. Solo necesita usar la función de Cast
para hacer que se convierta en un 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 LINQ.
También puede usar la sintaxis de comprensión de consultas de LINQ, que arroja al tipo de la variable de rango ( item
en este ejemplo) si 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; ver 7.16.2.2: Tipos de variables de rango explícito en la especificación del lenguaje C # para más detalles.