IEnumerable <KeyValuePair <>> 'dan Sözlük Yeniden Oluşturma


173

Bir döndüren bir yöntem var IEnumerable<KeyValuePair<string, ArrayList>>, ancak bazı arayanlar için bir sözlük yönteminin sonucu gerektirir. Nasıl dönüştürebilirsiniz IEnumerable<KeyValuePair<string, ArrayList>>bir içine Dictionary<string, ArrayList>kullandığım böylece TryGetValue?

yöntem:

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

arayan:

Dictionary<string, ArrayList> actual = target.GetComponents();
actual.ContainsKey("something");

Yanıtlar:


329

.NET 3.5 veya .NET 4 kullanıyorsanız, sözlüğü LINQ kullanarak oluşturmak kolaydır:

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

Diye bir şey yok IEnumerable<T1, T2>ama a KeyValuePair<TKey, TValue>gayet iyi.


15
Sözlük <TKey, TValue> ifadesinin IEnumerable <KeyValuePair <TKey, TValue >> uyguladığı, ancak oh iyi olduğu göz önüne alındığında, bağımsız değişken gerektirmeyen bir çağrı olacağını düşünürdünüz. Kendi yapmak için yeterince kolay.
Casey

6
@DanVerdolino Bunu biliyorum. Bunun bir IEnumerable KVP ile yapmak isteyebileceğiniz en yaygın şeylerden biri gibi olduğunu düşünürdünüz.
Casey

17
2016 şimdi, ve ben hala bunu google vardı. Aşağıdakiler için bir yapıcı olacağını düşünmek istiyorum Dictionaryki aldı IEnumerable<KeyValuePair<TKey, TValue>>gibi List<T>bir sürer IEnumerable<T>. Ayrıca anahtar / değer çiftlerini alan yok AddRangeveya hatta Addvar. Bunun nesi var?
ölmek maus

5
Şimdi 2017 ve bunu bir uzantı yöntemi olarak ekleyebiliriz!
Chris Bush

2
Bir çok ".net çekirdeğinde <bariz özellik> bulunmadığına inanamıyorum" MoreLinq aracılığıyla çözümlenir . Parametresiz bir IEnumerable <KeyValuePair> ->ToDictionary()
aaaaaa dahil

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.