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.