J'ai une classe qui implémente IEnumerable
, mais qui n'implémente pas IEnumerable
. Je ne peux pas changer cette classe et je ne peux pas utiliser une autre classe à sa place. D'après ce que j'ai compris de MSDN LINQ peut être utilisé si la classe implémente IEnumerable
. J'ai essayé d'utiliser instance.ToQueryable()
, mais cela ne permet toujours pas d'utiliser les méthodes LINQ. Je sais avec certitude que cette classe ne peut contenir que des instances d'un seul type, donc la classe pourrait implémenter IEnumerable
, mais ce n'est tout simplement pas le cas. Que puis-je faire pour interroger cette classe en utilisant des expressions LINQ?
Réponses
Trop de publicités?Vous pouvez utiliser Cast()
ou OfType
pour obtenir une version générique d'un IEnumerable qui prend en charge pleinement LINQ.
Par exemple.
IEnumerable objets = ...;
IEnumerable chaines = objets.Cast();
Ou si vous ne savez pas quel type il contient, vous pouvez toujours faire:
IEnumerable e = objets.Cast();
Si votre IEnumerable non générique contient des objets de différents types et que vous êtes uniquement intéressé par exemple par les chaînes, vous pouvez faire:
IEnumerable chaines = objets.OfType();
Vous pouvez également utiliser la syntaxe de compréhension de requête LINQ, qui effectue une conversion forcée vers le type de la variable de plage (item
dans cet exemple) si un type est spécifié :
IEnumerable list = new ArrayList { "chien", "chat" };
IEnumerable 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);
}
L'effet est identique à la solution de @JaredPar; voir 7.16.2.2: Types de variable de plage explicites dans la spécification du langage C# pour plus de détails.