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
Anonymous
August 26, 2008
var list = (new [] { new { FirstName="Guillaume", LastName="Renaud" } }).ToList();Anonymous
August 26, 2008
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" });Anonymous
August 26, 2008
je dirais même plus : var lst = new[]{ new { FirstName = "Brutus", LastName = "Renaud" }, new { FirstName = "Dick", LastName = "Il est petit" } }.ToList();Anonymous
August 26, 2008
Voir même : var lst = new[]{ new { FirstName = "Brutus", LastName = "Renaud" }, new { FirstName = "Prout", LastName = "Prout" }, new { FirstName = "Dick", LastName = "Il est petit" } }.ToList();Anonymous
August 26, 2008
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...Anonymous
August 28, 2008
En voici un un peu plus dur. J'ai un ensemble de villes 'cities' et une liste de groupes de villes. J'aimeraiAnonymous
August 29, 2008
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; } ?