mai
2007
Pour rappel, les Collections Initializer permettent de remplir une liste dans la même instruction que son initialisation :
List<string> brothers = new List<string> { "Matthieu", "Vincent", "Perrine", "Sylvain", "Rémi" };
cela équivaut à :
brothers.Add("Matthieu");
brothers.Add("Vincent");
brothers.Add("Perrine");
brothers.Add("Sylvain");
brothers.Add("Rémi");
Je me suis posé la question suivante : que fait-il pour utiliser les collection initializer sur un object ? Il faut que la classe de l’objet implémente IEnumerable
Et comme je vois venir la question « et pour les Dictionnary ? », je la précède. Pour les Dictionary
Dictionary<string, List<string>> brothers = new Dictionary<string, List<string>> { { "Mezil", new List<string> { "Matthieu", "Vincent", "Perrine", "Sylvain", "Rémi" } } };
et bien c’est pareil, la classe Dictionary
Pourquoi ce double niveau d’accolades ?
En fait quand le Add prend plusieurs paramètres, on les regroupe entre accolades.
Prenons un exemple :
{
private string un;
private string deux;
private string trois;
public string Un
{
get { return un; }
set { un = value; }
}
public string Deux
{
get { return deux; }
set { deux = value; }
}
public string Trois
{
get { return trois; }
set { trois = value; }
}
}
public class Test3 : IEnumerable<Test3Struct>
{
private List<Test3Struct> _list = new List<Test3Struct>();
public void Add(string un, string deux, string trois)
{
_list.Add(new Test3Struct() { Un = un, Deux = deux, Trois = trois }); // On remarquera l'utilisation d'un Object initializer
}
public IEnumerator<Test3Struct> GetEnumerator()
{
return _list.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
et pour initialiser une instance de Test3, il suffit de faire ceci :
Test3 t3 = new Test3() { { "un", "deux", "trois" }, { "un2", "deux2", "trois2" } };