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");

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.