Как преобразовать IEnumerable из KeyValuePair<x, y> в словарь?
Есть ли упрощенный для преобразования список / перечисление KeyValuePair<T, U>
в Dictionary<T, U>
?
Преобразование Linq, расширение.ToDictionary() не работает.
4 ответа
.ToDictionary(kvp=>kvp.Key,kvp=>kvp.Value);
Разве это не намного больше работы.
Вы можете создать свой собственный метод расширения, который будет работать так, как вы ожидаете.
public static class KeyValuePairEnumerableExtensions
{
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> source)
{
return source.ToDictionary(item => item.Key, item => item.Value);
}
}
Это лучшее, что я мог произвести:
public static IDictionary<TKey, TValue> ToDictionary<TKey, TValue>(IEnumerable<KeyValuePair<TKey, TValue>> keyValuePairs)
{
var dict = new Dictionary<TKey, TValue>();
var dictAsIDictionary = (IDictionary<TKey, TValue>) dict;
foreach (var property in keyValuePairs)
{
(dictAsIDictionary).Add(property);
}
return dict;
}
Я сравнил скорость преобразования IEnumerable из 20 миллионов пар ключ-значение в словарь с помощью Linq.ToDictionary со скоростью этого. Этот работал в 80% случаев версии Linq. Так что быстрее, но не намного. Я думаю, что вам действительно нужно оценить 20% экономии, чтобы это стоило использовать.
Аналогично другим, но с использованием вместо
ToDictionary
(поскольку
new
уже поддерживает
KeyValuePair
перечисления) и разрешая передачу
IEqualityComparer<TKey>
.
Также включая
ToReadOnlyDictionary
вариант для полноты.
public static class EnumerableKeyValuePairExtensions {
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> keyValuePairs, IEqualityComparer<TKey>? comparer = null)
where TKey : notnull
=> new Dictionary<TKey, TValue>(keyValuePairs, comparer);
public static ReadOnlyDictionary<TKey, TValue> ToReadOnlyDictionary<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> keyValuePairs, IEqualityComparer<TKey>? comparer = null)
where TKey : notnull
=> new ReadOnlyDictionary<TKey, TValue>(keyValuePairs.ToDictionary(comparer));
}