Tengo una clase que implementa IEnumerable, pero no implementa IEnumerable<T>. No puedo cambiar esta clase y no puedo usar otra clase en su lugar. Como he entendido de MSDN, LINQ se puede usar si la clase implementaIEnumerable<T> . Intenté usar instance.ToQueryable(), pero todavía no habilita los métodos LINQ. Estoy seguro de 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 usando expresiones LINQ?
.net
linq
ienumerable
Bogdan Verbenets
fuente
fuente

Respuestas:
Puede usar
Cast<T>()oOfType<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 no genérico
IEnumerablecontiene objetos de varios tipos y solo está interesado en, por ejemplo. las cadenas que puedes hacer:IEnumerable<string> strings = objects.OfType<string>();fuente
Sí puede. Solo necesita usar la
Cast<T>función para convertirlo en unIEnumerable<T>. Por ejemplo:IEnumerable e = ...; IEnumerable<object> e2 = e.Cast<object>();Ahora
e2es unIEnumerable<T>y puede trabajar con todas las funciones de LINQ.fuente
También puede usar la sintaxis de comprensión de consultas de LINQ, que se convierte en el tipo de la variable de rango (
itemen 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; consulte 7.16.2.2: Tipos de variables de rango explícitos en la especificación del lenguaje C # para obtener más detalles.
fuente