Lorsque vous avez une collection non générique, qui n’implémente donc pas l’interface IEnumerable<T>, et qui en plus contient des objets de type différents, il n’est pas possible d’utiliser la méthode d’extension Cast<T> (voir mon billet précédent « Exécuter une requête Linq sur une collection non générique« ). Alors comment faire pour exécuter une requête Linq to Objects sur une collection de type ArrayList qui contient des objets de type System.Drawing.Color et System.Drawing.Point mélangés ?

Et bien tout simplement en utilisant une autre méthode d’extension nommée OfType :

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source);

Si on reprend notre ArrayList contenant des objets Color et Point, il va être possible d’exécuter une requête Linq pour manipuler par exemple les objets de type Color :


static class Program
{
      static void Main(string[] args)
      {
            System.Collections.ArrayList myArrayList = new System.Collections.ArrayList();
            myArrayList.Add(System.Drawing.Color.Red);
            myArrayList.Add(new System.Drawing.Point(0, 0));
            myArrayList.Add(System.Drawing.Color.Green);
            myArrayList.Add(new System.Drawing.Point(10, 20));
            myArrayList.Add(System.Drawing.Color.Blue);
            myArrayList.Add(new System.Drawing.Point(20, 30));

            var query = from color in myArrayList.OfType<System.Drawing.Color>()
                        select color;
            foreach (var currentResult in query)
                  Console.WriteLine(currentResult.Name);
            Console.Read();
      }
}

Vous remarquerez qu’à la compilation le code est accepté et mieux encore à l’exécution, aucun plantage de l’application. On retrouve d’ailleurs bien le résultat attendu :

Red
Green
Blue

Bon à savoir, n’est-ce pas ?!