Neuerstellen eines Wörterbuchs aus einem IEnumerable <KeyValuePair <>>


172

Ich habe eine Methode, die eine zurückgibt IEnumerable<KeyValuePair<string, ArrayList>>, aber einige der Aufrufer verlangen, dass das Ergebnis der Methode ein Wörterbuch ist. Wie kann ich das IEnumerable<KeyValuePair<string, ArrayList>>in ein konvertieren, Dictionary<string, ArrayList>damit ich es verwenden kann TryGetValue?

Methode:

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

Anrufer:

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

Antworten:


328

Wenn Sie .NET 3.5 oder .NET 4 verwenden, können Sie das Wörterbuch ganz einfach mit LINQ erstellen:

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

Es gibt kein, IEnumerable<T1, T2>aber ein KeyValuePair<TKey, TValue>ist in Ordnung.


15
Sie würden denken, dass es einen Aufruf geben würde, der keine Argumente erfordert, da Dictionary <TKey, TValue> IEnumerable <KeyValuePair <TKey, TValue >> implementiert, aber na ja. Einfach genug, um Ihre eigenen zu machen.
— Casey

6
@ DanVerdolino Das weiß ich. Sie würden das denken, weil es eines der häufigsten Dinge ist, die Sie mit einer IEnumerable von KVPs tun möchten.
— Casey

17
2016 jetzt, und ich musste dies noch googeln. Man könnte meinen , dass es ein Konstruktor sein , Dictionarydass eine nahm IEnumerable<KeyValuePair<TKey, TValue>>wie List<T>ein nimmt IEnumerable<T>. Es gibt auch keine AddRangeoder sogar AddSchlüssel / Wert-Paare. Was ist damit?
— Die Maus

5
Es ist jetzt 2017 und wir können dies als Erweiterungsmethode hinzufügen!
— Chris Bush

2
Viele "Ich kann nicht glauben, dass der .net-Kern keine <offensichtliche Funktion> hat" werden über MoreLinq gelöst . Einschließlich eines parameterlosen IEnumerable <KeyValuePair> ->ToDictionary()
— aaaaaa

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.