Ricreazione di un dizionario da un IEnumerable <KeyValuePair <>>


173

Ho un metodo che restituisce un IEnumerable<KeyValuePair<string, ArrayList>>, ma alcuni dei chiamanti richiedono che il risultato del metodo sia un dizionario. Come posso convertire il file IEnumerable<KeyValuePair<string, ArrayList>>in a in Dictionary<string, ArrayList>modo da poterlo utilizzare TryGetValue?

metodo:

public IEnumerable<KeyValuePair<string, ArrayList>> GetComponents()
{
  // ...
  yield return new KeyValuePair<string, ArrayList>(t.Name, controlInformation);
}

chiamante:

Dictionary<string, ArrayList> actual = target.GetComponents();
actual.ContainsKey("something");

Risposte:


329

Se stai usando .NET 3.5 o .NET 4, è facile creare il dizionario usando LINQ:

Dictionary<string, ArrayList> result = target.GetComponents()
                                      .ToDictionary(x => x.Key, x => x.Value);

Non esiste una cosa come IEnumerable<T1, T2>ma a KeyValuePair<TKey, TValue>va bene.


15
Penseresti che ci sarebbe una chiamata che non richiede argomenti, dato che Dictionary <TKey, TValue> implementa IEnumerable <KeyValuePair <TKey, TValue >>, ma vabbè. Abbastanza facile da fare da solo.
Casey

6
@DanVerdolino Lo so. Lo penseresti perché è come una delle cose più comuni che potresti voler fare con un IEnumerable di KVPs.
Casey,

17
2016 ora, e ho ancora dovuto cercarlo su Google. Penseresti che ci sarebbe un costruttore Dictionaryche avrebbe preso IEnumerable<KeyValuePair<TKey, TValue>>proprio come List<T>prende a IEnumerable<T>. Inoltre non esiste alcuno AddRangeo addirittura Addche accetta coppie chiave / valore. Cosa succede con quello?
die maus,

5
È il 2017 adesso e possiamo aggiungerlo come metodo di estensione!
Chris Bush,

2
Molti "Non riesco a credere che il core .net non abbia <funzionalità ovvia>" è stato risolto tramite MoreLinq . Incluso un IEnumerable senza parametri <KeyValuePair> ->ToDictionary()
aaaaaa

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.