Il est à priori possible d’interroger n’importe quel type de collections à condition qu’elle implémente l’interface IEnumerable<T>, ce qui n’est pas le cas des collections non génériques, tel que « System.Collections.ArrayList ». Il semblerait donc qu’il ne soit pas possible d’exécuter une requête Linq to Objects sur une collection de type ArrayList et pourtant, il y a une astuce.

Tout d’abord, il faut bien comprendre que Linq to Objects repose sur l’interface IEnumerable<T> car c’est grâce à cette interface que le compilateur va pouvoir déterminer le type d’objet contenu dans une collection. Or avec une collection de type ArrayList, il n’est pas possible de déterminer le type des objets contenus dans la collection. Pour résoudre ce problème, Microsoft a introduit une méthode d’extension appelée « Cast ».

public static IEnumerable<T> Cast<T>(this IEnumerable source);

Comme vous pouvez le constater en regardant la définition de cette méthode, elle prend en paramètre une collection qui implémente l’interface IEnumerable et renvoie un objet de type IEnumerable<T>. Cette méthode est évidemment générique pour que vous puissiez spécifier explicitement le type d’objet contenu dans votre collection.

Si on considère que nous avons un ArrayList contenant des objets de type Process, nous allons pouvoir écrire le code suivant :

System.Collections.ArrayList myArrayList = new System.Collections.ArrayList();

// Ajout d’instances de type Process dans notre ArrayList
// …

var query = from process in myArrayList.Cast<System.Diagnostics.Process>()
            select process;