Ponowne tworzenie słownika z IEnumerable <KeyValuePair <>>

173

Mam metodę, która zwraca IEnumerable<KeyValuePair<string, ArrayList>>, ale niektórzy wywołujący wymagają, aby wynik metody był słownikiem. Jak mogę zamienić IEnumerable<KeyValuePair<string, ArrayList>>na a, Dictionary<string, ArrayList>żeby móc używać TryGetValue?

metoda:

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

gość:

Dictionary<string, ArrayList> actual = target.GetComponents();
actual.ContainsKey("something");
learnerplates
źródło
Możliwy duplikat? stackoverflow.com/questions/7850334/…
Coolkau

Odpowiedzi:

329

Jeśli używasz .NET 3.5 lub .NET 4, możesz łatwo utworzyć słownik za pomocą LINQ:

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

Nie ma czegoś takiego jak IEnumerable<T1, T2>ale a KeyValuePair<TKey, TValue>jest w porządku.

Jon Skeet
źródło
15
Można by pomyśleć, że byłoby wywołanie, które nie wymaga argumentów, biorąc pod uwagę, że Dictionary <TKey, TValue> implementuje IEnumerable <KeyValuePair <TKey, TValue >>, ale no cóż. Wystarczająco łatwe, aby stworzyć własne.
Casey
6
@DanVerdolino Wiem to. Można by pomyśleć, ponieważ jest to jedna z najczęstszych rzeczy, które możesz chcieć zrobić z IEnumerable KVP.
Casey
17
2016 teraz i nadal musiałem to wygooglować. Można by pomyśleć, że będzie konstruktor, Dictionaryktóry zająłby takie IEnumerable<KeyValuePair<TKey, TValue>>samo, jak List<T>trwa IEnumerable<T>. Nie ma również par klucz / wartość AddRangelub nawet takich, Addktóre przyjmują. O co w tym chodzi?
die maus
5
Teraz jest rok 2017 i możemy dodać to jako metodę rozszerzenia!
Chris Bush
2
Wiele problemów „Nie mogę uwierzyć, że .net core nie ma <oczywistej funkcji>” można rozwiązać za pomocą MoreLinq . W tym bez parametrów IEnumerable <KeyValuePair> ->ToDictionary()
aaaaaa