如何转换IEnumerable的KeyValuePair字典

本文关键字:字典 KeyValuePair 何转换 转换 IEnumerable | 更新日期: 2023-09-27 18:11:51

是否有简化的方法将KeyValuePair<T, U>的列表/可计数转换为Dictionary<T, U> ?

Linq转换,. todictionary()扩展不能工作。

如何转换IEnumerable的KeyValuePair<x, y>字典

.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;
}

我比较了使用Linq将2000万个键值对的IEnumerable转换为Dictionary的速度。以这个的速度去查字典。这个版本的运行时间是Linq版本的80%。所以它更快,但不是很多。我认为你真的需要珍惜这20%的节省,让它值得使用。

与其他类似,但使用new而不是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));
}