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.