Відтворення словника з безлічі <KeyValuePair <>>


173

У мене є метод, який повертає IEnumerable<KeyValuePair<string, ArrayList>>, але деякі з абонентів вимагають, щоб результат методу був словником. Як я можу перетворити IEnumerable<KeyValuePair<string, ArrayList>>на Dictionary<string, ArrayList>так, щоб я міг використовувати TryGetValue?

метод:

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

абонент:

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

Можливий дублікат? stackoverflow.com/questions/7850334 / ...
Coolkau

Відповіді:


329

Якщо ви використовуєте .NET 3.5 або .NET 4, створити словник легко, використовуючи LINQ:

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

Немає такого, як, IEnumerable<T1, T2>але KeyValuePair<TKey, TValue>це добре.


15
Ви можете подумати, що буде виклик, який не потребує аргументів, враховуючи, що словник <TKey, TValue> реалізує IEnumerable <KeyValuePair <TKey, TValue >>, але так добре. Досить просто, щоб зробити своє.
Кейсі

6
@DanVerdolino Я це знаю. Ви можете подумати, що це як одна з найпоширеніших речей, яку ви можете зробити з IE Число KVP.
Кейсі

17
2016 зараз, і мені все одно довелося це гуляти. Ви б могли подумати, що буде конструктор для того, Dictionaryщо займає так IEnumerable<KeyValuePair<TKey, TValue>>само, як і " List<T>a" IEnumerable<T>. Крім того, немає AddRangeабо навіть, Addщо займає пар ключ / значення. Що з цим?
die maus

5
Зараз 2017 рік, і ми можемо додати це як метод розширення!
Кріс Буш

2
Багато "я не можу повірити.. Ядро не має <очевидна особливість>" вирішено через MoreLinq . Включаючи параметр IEsumerable <KeyValuePair> ->ToDictionary()
aaaaaa

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.