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");
Lernteller
quelle
Mögliches Duplikat? stackoverflow.com/questions/7850334/…
Coolkau

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.

Jon Skeet
quelle
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