103 votes

Est-ce que LINQ fonctionne avec IEnumerable ?

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?

157voto

DeCaf Points 2990

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();

14voto

JaredPar Points 333733

Oui, cela peut être fait. Il vous suffit d'utiliser la fonction Cast pour le convertir en un IEnumerable typé. Par exemple:

IEnumerable e = ...;
IEnumerable e2 = e.Cast();

Maintenant, e2 est un IEnumerable et peut fonctionner avec toutes les fonctions LINQ.

4voto

TrueWill Points 14855

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X