如何将KeyValuePair的IEnumerable <x,y =“”>转换为字典?</x,>

时间:2011-10-21 13:48:43

标签: linq dictionary todictionary

是否可以简化将KeyValuePair<T, U>的列表/可传播数转换为Dictionary<T, U>

Linq转换,.ToDictionary()扩展无效。

4 个答案:

答案 0 :(得分:54)

.ToDictionary(kvp=>kvp.Key,kvp=>kvp.Value);

没有那么多工作。

答案 1 :(得分:10)

您可以创建自己的扩展方法,该方法可以按预期执行。

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

答案 2 :(得分:0)

这是我能做的最好的:

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.ToDictionary将一个拥有2000万个键值对的IEnumerable转换为一个字典的速度。这个版本在Linq版本的80%的时间内运行。所以它更快,但不是很多。我认为你真的需要重视节省20%才能使其值得使用。

答案 3 :(得分:0)

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