GQ08 VIII: initialisation de collections


Depuis .Net 3.5, C# (3.0 donc) propose une syntaxe facilitant l’initialisation de collections.
On peut ainsi écrire:

var list = new List<string> { "Paris", "Londres" };


Imaginons maintenant que l’on veuille initialiser une liste d’un type anonyme.
Ex d’élément: ‘new { FirstName=”Guillaume”, LastName=”Renaud” }’

J’attends vos propositions.

Comments (7)

  1. var list = (new [] { new { FirstName="Guillaume", LastName="Renaud" } }).ToList();

  2. Oui je sais je reprend mes vieilles habitudes de poster deux commentaires mais on peut aussi faire ça :

    List<T> CreateList<T>(params T[] elements)

    {

       return new List<T>(elements);

    }

    var list2 = CreateList(new { FirstName = "Guillaume", LastName = "Renaud" });

  3. Simon says:

    je dirais même plus :

    var lst =  new[]{ new { FirstName = "Brutus", LastName = "Renaud" },

                   new { FirstName = "Dick", LastName = "Il est petit" } }.ToList();

  4. Simon says:

    Voir même :

    var lst =  new[]{ new { FirstName = "Brutus", LastName = "Renaud" },

                  new { FirstName = "Prout", LastName = "Prout" },

                  new { FirstName = "Dick", LastName = "Il est petit" } }.ToList();

  5. Mitsu Furuta says:

    Bon, mettons de côté les private jokes de Simon et le fait que Matthieu ne puisse s’empêcher de tricher..

    Cet exemple est intéressant car l’usage des types anonymes est très particulier. Bien que finalement compilé exactement comme un type classique, un type anonyme a la particularité de ne pouvoir être manipulé que dans la méthode qui le définit. L’instance peut bien évidemment être passée ou retournée en tant que ‘object’. Il existe cependant un usage intéressant qui est de la passer à une méthode générique. L’inférence de type utilisera sans problème le type anonyme afin de définir T.

    Dans notre exemple, le problème est simple:

    var list =

     new List<?> { new { FirstName = "Guillaume", LastName = "Renaud" } };

    En effet, comment créer la liste: new List<?> ?

    En créant la méthode CreateList ci-dessous, le paramètre générique T sera déduit (inféré) par les paramètres peut importe que le type soit anonyme ou pas.

    List<T> CreateList<T>(params T[] elements)

    {

      return new List<T>(elements);

    }

    La solution:

    var list = (new [] { new { FirstName="Guillaume", LastName="Renaud" } }).ToList();

    répond tout à fait au quizz mais je voulais surtout montrer l’usage de l’inférence de type avec un type anonyme que l’on peut retrouver dans bien d’autres usages. 4

    Je finirai par dire qu’il y a de grandes chances que C# 4 élargisse les scénarii d’usage des types anonymes…

  6. En voici un un peu plus dur. J’ai un ensemble de villes ‘cities’ et une liste de groupes de villes. J’aimerai

  7. S’il s’agit juste de forcer l’inférence de type, pourquoi ne pas simplifier en:

    static IEnumerable<T> AsEnumerable<T>(params T[] elements)

    {

      return elements;

    }

    ?