Как преобразовать 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));
}
Другие вопросы по тегам