net getenumerator .net linq ienumerable

.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.