Menciptakan Kamus dari IEnumerable <KeyValuePair <>>

173

Saya memiliki metode yang mengembalikan IEnumerable<KeyValuePair<string, ArrayList>>, tetapi beberapa penelepon membutuhkan hasil metode untuk menjadi kamus. Bagaimana saya bisa mengonversikan IEnumerable<KeyValuePair<string, ArrayList>>ke dalam Dictionary<string, ArrayList>sehingga saya dapat menggunakan TryGetValue?

metode:

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

penelepon:

Dictionary<string, ArrayList> actual = target.GetComponents();
actual.ContainsKey("something");
pelat pelajar
sumber
Kemungkinan duplikat? stackoverflow.com/questions/7850334/…
Coolkau

Jawaban:

329

Jika Anda menggunakan .NET 3.5 atau .NET 4, mudah untuk membuat kamus menggunakan LINQ:

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

Tidak ada yang namanya IEnumerable<T1, T2>tapi KeyValuePair<TKey, TValue>tidak apa-apa.

Jon Skeet
sumber
15
Anda akan berpikir akan ada panggilan yang tidak memerlukan argumen, mengingat bahwa Kamus <TKey, TValue> mengimplementasikan IEnumerable <KeyValuePair <TKey, TValue >>, tapi oh well. Cukup mudah untuk membuatnya sendiri.
Casey
6
@DanVerdolino Saya tahu itu. Anda akan berpikir itu karena itu seperti salah satu hal paling umum yang mungkin ingin Anda lakukan dengan IEnumerable of KVPs.
Casey
17
2016 sekarang, dan saya masih harus google ini. Anda akan berpikir bahwa akan ada konstruktor untuk Dictionaryyang mengambil IEnumerable<KeyValuePair<TKey, TValue>>seperti List<T>mengambil IEnumerable<T>. Juga tidak ada AddRangeatau bahkan Addyang mengambil pasangan kunci / nilai. Ada apa dengan itu?
die maus
5
Sekarang tahun 2017, dan kami dapat menambahkan ini sebagai metode ekstensi!
Chris Bush
2
Banyak "Saya tidak percaya. Net core tidak memiliki <fitur jelas>" diselesaikan melalui MoreLinq . Termasuk IE tanpa parameternnumerable <KeyValuePair> ->ToDictionary()
aaaaaa