如何合并两个字典,但在重复键上合并C#中的值?

如何合并两个字典,但在重复键上合并C#中的值?,c#,dictionary,merge,C#,Dictionary,Merge,我有两本结构相同的词典 Dictionary<string, List<int>> dictA Dictionary<string, List<int>> dictB 变成 ("wow", {0,0,0}) ("qwerty", {4,0,4}) ("key", {1,2,3,4,5,6}) 我该怎么做呢?在键上加入组,然后在值上加入一个union或SelectMany您可以首先将字典与组合在一个IEnumerable中。我们这样做是因为某些键

我有两本结构相同的词典

Dictionary<string, List<int>> dictA
Dictionary<string, List<int>> dictB
变成

("wow", {0,0,0})
("qwerty", {4,0,4})
("key", {1,2,3,4,5,6})

我该怎么做呢?

在键上加入组,然后在值上加入一个union或SelectMany

您可以首先将字典与组合在一个
IEnumerable
中。我们这样做是因为某些键可能不存在于两个字典中,我们希望它们包含在最终合并结果中

然后,我们可以使用对键进行分组,然后创建一个最终合并的
字典
with,以确保内部分组的列表被整平


可以使用linq实现,但只需使用几个foreach循环即可

var dictA = new Dictionary<string, List<int>>
{
    { "wow", new List<int>{0,0,0} },
    { "key", new List<int>{1,2,3} }
};
var dictB = new Dictionary<string, List<int>>
{
    { "querty", new List<int>{4,0,4} },
    { "key", new List<int>{4,5,6} }
};

var merged = new Dictionary<string, List<int>>();

foreach(var kvp in dictA)
{
    merged.Add(kvp.Key, kvp.Value);

    if(dictB.TryGetValue(kvp.Key, out var inB))
    {
        kvp.Value.AddRange(inB);
        dictB.Remove(kvp.Key);
    }
}

foreach (var kvp in dictB)
    merged.Add(kvp.Key, kvp.Value);
var dictA=新字典
{
{“哇”,新列表{0,0,0},
{“键”,新列表{1,2,3}
};
var dictB=新字典
{
{“querty”,新列表{4,0,4},
{“键”,新列表{4,5,6}
};
var merged=newdictionary();
foreach(dictA中的var kvp)
{
添加(kvp.Key,kvp.Value);
if(dictB.TryGetValue(kvp.Key,out var inB))
{
kvp.Value.AddRange(inB);
dictB.Remove(kvp.Key);
}
}
foreach(dictB中的var kvp)
添加(kvp.Key,kvp.Value);

一种算法可以是:检查
dictA
中的每个条目,检查
dictB
是否有具有相同密钥的条目。如果没有,只需使用
dictA
条目,否则将两个条目连接起来(
listA.Concat(listB.ToList()
)。然后检查
dictB
中的每个条目,检查
dictA
是否有具有相同键的条目。如果没有,只需获取
dictB
条目,否则忽略它,因为它已经在执行
dictA
时处理过了。
var dictA = new Dictionary<string, List<int>>
{
    { "wow", new List<int>{0,0,0} },
    { "key", new List<int>{1,2,3} }
};

var dictB = new Dictionary<string, List<int>>
{
    { "querty", new List<int>{4,0,4} },
    { "key", new List<int>{4,5,6} }
};

var merged = dictA
    .Concat(dictB)
    .ToLookup(kvp => kvp.Key, kvp => kvp.Value)
    .ToDictionary(group => group.Key, group => group.SelectMany(x => x).ToList());

foreach (var kvp in merged)
{
    Console.WriteLine($"{kvp.Key} -> {"{ " + string.Join(", ", kvp.Value) + " }"}");
}
wow -> { 0, 0, 0 }
key -> { 1, 2, 3, 4, 5, 6 }
querty -> { 4, 0, 4 }
var dictA = new Dictionary<string, List<int>>
{
    { "wow", new List<int>{0,0,0} },
    { "key", new List<int>{1,2,3} }
};
var dictB = new Dictionary<string, List<int>>
{
    { "querty", new List<int>{4,0,4} },
    { "key", new List<int>{4,5,6} }
};

var merged = new Dictionary<string, List<int>>();

foreach(var kvp in dictA)
{
    merged.Add(kvp.Key, kvp.Value);

    if(dictB.TryGetValue(kvp.Key, out var inB))
    {
        kvp.Value.AddRange(inB);
        dictB.Remove(kvp.Key);
    }
}

foreach (var kvp in dictB)
    merged.Add(kvp.Key, kvp.Value);