Welcome to MSDN Blogs Sign in | Join | Help

News


  • Locations of visitors to this page
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.

Posted: Tuesday, August 26, 2008 3:27 PM by mitsu
Filed under: , , ,

Comments

Matthieu MEZIL said:

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

# August 26, 2008 9:32 AM

Matthieu MEZIL said:

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" });

# August 26, 2008 9:37 AM

Simon said:

je dirais même plus :

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

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

# August 26, 2008 10:23 AM

Simon said:

Voir même :

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

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

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

# August 26, 2008 10:39 AM

mitsu said:

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...

# August 26, 2008 2:57 PM

Mitsuru FURUTA - Microsoft FRANCE said:

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

# August 28, 2008 12:56 PM

Simon Mourier said:

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;

}

?

# August 29, 2008 11:30 AM
Leave a Comment

(required) 

(required) 

(optional)

(required) 

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Page view tracker