Воссоздание словаря из IEnumerable ‹KeyValuePair‹ ››

У меня есть метод, который возвращает 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");

person learnerplates    schedule 14.04.2010    source источник
comment
Возможный дубликат? stackoverflow .com / questions / 7850334 /.   -  person Coolkau    schedule 18.10.2016


Ответы (2)


Если вы используете .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> в порядке.

person Jon Skeet    schedule 14.04.2010
comment
Можно подумать, что будет вызов, который не требует аргументов, учитывая, что Dictionary ‹TKey, TValue› реализует IEnumerable ‹KeyValuePair‹ TKey, TValue ››, но да ладно. Достаточно легко сделать самому. - person Casey; 09.04.2014
comment
@emodendroket, почему ты так думаешь? Вы можете преобразовать Dictionary непосредственно в упомянутый IEnumerable из-за интерфейса, но не наоборот. т.е. IEnumerable<KeyValuePair<TKey, TValue>> не реализует и не наследует Dictionary<TKey, TValue>. - person djv; 01.07.2014
comment
@DanVerdolino Я знаю это. Можно подумать, потому что это одна из самых распространенных вещей, которые вы можете делать с IEnumerable KVP. - person Casey; 01.07.2014
comment
2016 год, и мне все еще пришлось гуглить. Вы могли подумать, что существует конструктор для Dictionary, который принимает IEnumerable<KeyValuePair<TKey, TValue>> так же, как List<T> принимает IEnumerable<T>. Также нет AddRange или даже Add, которые принимают пары ключ / значение. Что с этим? - person die maus; 03.09.2016
comment
Сейчас 2017 год, и мы можем добавить это как метод расширения! - person Chris Bush; 11.05.2017
comment
Я не могу поверить, что в ядре .net нет ‹очевидной функции› решается с помощью MoreLinq. Включая IEnumerable без параметров ‹KeyValuePair› - ›ToDictionary() - person aaaaaa; 07.12.2017
comment
public static Dictionary<TKey,TValue> ToDictionary<TKey,TValue>(this IEnumerable<KeyValuePair<TKey,TValue>> source) => source.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); Если вы дочитали до этого места и все еще хотите, вот этот ответ в качестве метода расширения. - person Tom Blodget; 09.08.2019

Начиная с .NET Core 2.0, конструктор _ 1_ теперь существует.

person Mason Kerr    schedule 26.04.2020