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?
Respuesta
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>();
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.
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.
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; }
}
'List
- 1. Excluir tipos de IEnumerable con linq
- 2. LINQ: ¿Cómo declarar IEnumerable [AnonymousType]?
- 3. List.AddRange con el parámetro IEnumerable <T> ¿no funciona?
- 4. LINQ: Seleccione de IEnumerable con Distinct/GroupBy y clasificación - posible?
- 5. LINQ - seleccionando segundo elemento en IEnumerable
- 6. IEnumerable <IEnumerable <T>> IEnumerable a <T> usando LINQ
- 7. ¿Por qué mi declaración LINQ devuelve IEnumerable?
- 8. Convertir LINQ ObjectQuery IQueryable a IEnumerable
- 9. Distinto no funciona con LINQ to Objects
- 10. ¿Cómo funciona IEnumerable <T> .ToArray()?
- 11. ¿Cómo funciona IEnumerable <T> .Reverse?
- 12. dinámico LINQ OrdenarPor en IEnumerable <T>
- 13. ¿LINQ funciona en Index?
- 14. ¿Cómo funciona linq Last()?
- 15. ¿Cómo funciona LINQ internamente?
- 16. datos Normalizar con LINQ
- 17. Una manera sencilla de actualizar objetos IEnumerable usando LINQ
- 18. LINQ to XML - ¿Cómo funciona?
- 19. números de serie a consecuencia de un LINQ IEnumerable
- 20. Optimizar la conversión de IEnumerable a HashSet en LINQ
- 21. ¿Los métodos de IEnumerable Linq son seguros para subprocesos?
- 22. Encuentra secuencia en IEnumerable <T> usando LINQ
- 23. Nhibernate LINQ DateTime.AddDay no funciona
- 24. C# LINQ `Lista <Interface> .AddRange` método no funciona
- 25. Convertir/Convertir IEnumerable en IEnumerable <T>
- 26. LINQ La consulta Lambda 'select' no funciona con oData
- 27. El pedido no funciona con Concat() en LINQ
- 28. Implementando IEnumerable con una matriz
- 29. Fecha distintiva con Linq
- 30. Obtener un IEnumerable <T> de un IEnumerable <IEnumerable <T>>
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