Воссоздание словаря из IEnumerable <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
Вы могли бы подумать, что будет вызов, который не требует аргументов, учитывая, что Dictionary <TKey, TValue> реализует IEnumerable <KeyValuePair <TKey, TValue >>, ну да ладно. Достаточно легко сделать свой собственный.
Кейси

6
@ DanVerdolino Я знаю это. Вы подумали бы, потому что это как одна из самых распространенных вещей, которые вы можете сделать с IEnumerable из KVP.
Кейси

17
2016 год, и я все еще должен был гуглить это. Вы могли бы подумать, что для этого будет конструктор, Dictionaryкоторый будет таким IEnumerable<KeyValuePair<TKey, TValue>>же, как List<T>берет a IEnumerable<T>. Также нет AddRangeили даже Addчто принимает пары ключ / значение. Что с этим?
умереть

5
Сейчас 2017 год, и мы можем добавить это как метод расширения!
Крис Буш

2
Большая часть «Я не могу поверить, что ядро ​​.net не имеет <очевидной особенности>», решается с помощью MoreLinq . Включая ToDictionary()
IE

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.