.NET Framework ToDictionary


Exemple

Renvoie un nouveau dictionnaire à partir de la source IEnumerable à l'aide de la fonction keySelector fournie pour déterminer les clés. Lance une exception ArgumentException si keySelector n'est pas injectif (renvoie une valeur unique pour chaque membre de la collection source). Des surcharges permettent de spécifier la valeur à stocker ainsi que la clé.

var persons = new[] {
    new { Name="Fizz", Id=1},
    new { Name="Buzz", Id=2},
    new { Name="Foo", Id=3},
    new { Name="Bar", Id=4},
};

La spécification d'une simple fonction de sélection de clé créera un Dictionary<TKey,TVal> avec TKey le type de retour du sélecteur à clé, TVal le type d'objet d'origine et l'objet d'origine comme valeur stockée.

var personsById = persons.ToDictionary(p => p.Id);
// personsById is a Dictionary<int,object>

Console.WriteLine(personsById[1].Name); //Fizz
Console.WriteLine(personsById[2].Name); //Buzz

La spécification d'une fonction de sélecteur de valeur créera également un Dictionary<TKey,TVal> avec TKey le type de retour du sélecteur de clé, mais TVal maintenant le type de retour de la fonction de sélection de valeur et la valeur renvoyée comme valeur stockée.

var namesById = persons.ToDictionary(p => p.Id, p => p.Name);
//namesById is a Dictionary<int,string>

Console.WriteLine(namesById[3]); //Foo
Console.WriteLine(namesById[4]); //Bar

Comme indiqué ci-dessus, les clés renvoyées par le sélecteur de clé doivent être uniques. Le suivant lancera une exception.

var persons = new[] {
    new { Name="Fizz", Id=1},
    new { Name="Buzz", Id=2},
    new { Name="Foo", Id=3},
    new { Name="Bar", Id=4},
    new { Name="Oops", Id=4}
};

var willThrowException = persons.ToDictionary(p => p.Id)

Si une clé unique ne peut pas être donnée pour la collection source, envisagez d'utiliser ToLookup à la place. En apparence, ToLookup se comporte de la même manière que ToDictionary, mais dans la recherche résultante, chaque clé est associée à une collection de valeurs avec des clés correspondantes.