合并 IDictionary - 有没有比这更有效的方法

本文关键字:有效 方法 IDictionary 有没有 合并 | 更新日期: 2023-09-27 18:32:45

我有一个帮助程序,它通过连接TValueToString()方法,将两个或多个IDictionary<TKey, TValue>对象合并为一个IDictionary<TKey, string>,如下所示:

public class DictionaryHelper<TKey, TValue>
{
    public static IDictionary<TKey, string> MergeDictionaries<TKey, TValue>(params IDictionary<TKey, TValue>[] dictionaries) where TValue : class
    {
        var returnValue = new Dictionary<TKey, string>();
        foreach (var dictionary in dictionaries)
        {
            foreach (var kvp in dictionary)
            {
                if (returnValue.ContainsKey(kvp.Key))
                {
                    returnValue[kvp.Key] += kvp.Value.ToString();
                }
                else
                {
                    returnValue[kvp.Key] = kvp.Value.ToString();
                }
            }
        }
        return returnValue;
    }
}

虽然这很简单且非常易于阅读,但似乎应该有一种更有效的方法可以做到这一点。 有吗?

合并 IDictionary - 有没有比这更有效的方法

我不知道

这是否更有效,但至少它要短得多:

var result = dictionaries.SelectMany(d => d)
                         .ToLookup(kvp => kvp.Key, kvp => kvp.Value)
                         .ToDictionary(g => g.Key, g => string.Concat(g));
您可以使用

SelectMany删除可见foreach

foreach (var kvp in dictionaries.SelectMany(dd => dd))
{
    if (returnValue.ContainsKey(kvp.Key))
    {
        returnValue[kvp.Key] += kvp.Value.ToString();
    }
    else
    {
        returnValue[kvp.Key] = kvp.Value.ToString();
    }
}

你可以进一步扩展它,尽管dtb的更优雅和高效:

var merged = dictionaries.SelectMany(dd => dd)
                         .GroupBy(kvp => kvp.Key, kvp => kvp.Value)
                         .ToDictionary(
                             gg => gg.Key,
                             gg => String.Concat(gg));

但是,这不太可能比您当前的方法更有效或更易读。

您可以使用 TryGetValue 来合并源值的位置和检索。