C# Language ToDictionary

Esempio

Il metodo LINQ ToDictionary() può essere utilizzato per generare un insieme di Dictionary<TKey, TElement> basato su una sorgente I Dictionary<TKey, TElement> IEnumerable<T> .

IEnumerable<User> users = GetUsers();
Dictionary<int, User> usersById = users.ToDictionary(x => x.Id);

In questo esempio, il singolo argomento passato a ToDictionary è di tipo Func<TSource, TKey> , che restituisce la chiave per ciascun elemento.

Questo è un modo conciso per eseguire la seguente operazione:

Dictionary<int, User> usersById = new Dictionary<int User>();
foreach (User u in users) 
{
  usersById.Add(u.Id, u);
}

È anche possibile passare un secondo parametro al metodo ToDictionary , che è di tipo Func<TSource, TElement> e restituisce il Value da aggiungere per ogni voce.

IEnumerable<User> users = GetUsers();
Dictionary<int, string> userNamesById = users.ToDictionary(x => x.Id, x => x.Name);

È anche possibile specificare IComparer che viene utilizzato per confrontare i valori chiave. Questo può essere utile quando la chiave è una stringa e vuoi che corrisponda a maiuscole e minuscole.

IEnumerable<User> users = GetUsers();
Dictionary<string, User> usersByCaseInsenstiveName = users.ToDictionary(x => x.Name, StringComparer.InvariantCultureIgnoreCase);

var user1 = usersByCaseInsenstiveName["john"];
var user2 = usersByCaseInsenstiveName["JOHN"];
user1 == user2; // Returns true

Nota: il metodo ToDictionary richiede che tutte le chiavi siano univoche, non ci devono essere chiavi duplicate. Se ci sono, allora viene generata un'eccezione: ArgumentException: An item with the same key has already been added. Se hai uno scenario in cui sai che avrai più elementi con la stessa chiave, allora preferisci utilizzare ToLookup .