C# 使用字典中的相同键连接值<;字符串,字符串>;

C# 使用字典中的相同键连接值<;字符串,字符串>;,c#,dictionary,C#,Dictionary,我需要合并两本字典。它们具有相同的键(KKK)和不同的值: dic2: 工会: Dictionary<string, string> dicUnion= dic1.Union(dic2).OrderBy(k => k.Key).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 我在union字典中使用相同的键连接值: ... [29] {[RCP, "555501001"]} [30] {[KKK, "046111

我需要合并两本字典。它们具有相同的键(KKK)和不同的值:

dic2:

工会:

Dictionary<string, string> dicUnion= dic1.Union(dic2).OrderBy(k => k.Key).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
我在union字典中使用相同的键连接值:

...
[29] {[RCP, "555501001"]}
[30] {[KKK, "04611105012042000120 04611701040040000180"]}
[31] {[SUM, "85737"]}
...

我将使用一个简单的循环来添加/附加项

Dictionary<string, string> dicUnion = new Dictionary<string, string>(dic1); 
foreach(var item in dic2)
{
    if(dicUnion.ContainsKey(item.Key))
    {
        dicUnion[item.Key] += " " + item.Value;
    }
    else
    {
        dicUnion.Add(item.Key, item.Value);
    }
}
字典dicUnion=新字典(dic1);
foreach(dic2中的var项目)
{
if(dicUnion.ContainsKey(项目编号))
{
dicUnion[item.Key]+=“”+item.Value;
}
其他的
{
添加(item.Key,item.Value);
}
}
就这样试试吧

        var intersectedItems = dic1.Where(x => dic2.ContainsKey(x.Key)).Select(x => new
        {
            Key = x.Key,
            Value = x.Value + " " + dic2[x.Key]
        }).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
        var dicUnion = dic1.Where(x => !intersectedItems.ContainsKey(x.Key))
            .Union(dic2.Where(x => !intersectedItems.ContainsKey(x.Key)))
            .Union(intersectedItems).OrderBy(k => k.Key)
            .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

如果您真的想在这种情况下使用LINQ(我更喜欢循环):

这将合并两个字典,但不关心公共键或不同的值

我需要合并两个字典,它们有相同的键(KKK)和 不同的价值观

好的,如果您只想创建公用键的字典:

var union = from kv1 in dic1
            join kv2 in dic2
            on kv1.Key equals kv2.Key into keyGroup
            where keyGroup.Any()
            select new KeyValuePair<string, string>(kv1.Key, string.Join(" ", keyGroup.Select(kv => kv.Value)));

Dictionary<string, string> dicUnion = union.ToDictionary(kv => kv.Key, kv => kv.Value);
现在,您可以根据需要对值执行任何操作,例如创建一个
列表

List values=keyLookup[“KKK”].ToList();

如果只想用同一个键连接值,可以使用
IEnumerable.Join
方法如下:

var res = dic1.Join(dic2, o1 => o1.Key, o2 => o2.Key, (o1, o2) => new { o1.Key, Value1 = o1.Value, Value2 = o2.Value});
dic1.Concat(dic2)
    .ToLookup(o => o.Key, o => o.Value)
    .ToDictionary(o => o.Key, o => string.Join(" ", o.Distinct()))
参数是第二个
IEnumerable
、键选择器和结果选择器。在我的代码片段中,我创建了匿名类,但您可以创建任何您想要的结构。结果还是
IEnumerable
,您可以迭代或使用其
ToList()
ToArray()
等方法

编辑:在阅读了其他帖子的评论后,我了解到您希望得到如下内容:

var res = dic1.Join(dic2, o1 => o1.Key, o2 => o2.Key, (o1, o2) => new { o1.Key, Value1 = o1.Value, Value2 = o2.Value});
dic1.Concat(dic2)
    .ToLookup(o => o.Key, o => o.Value)
    .ToDictionary(o => o.Key, o => string.Join(" ", o.Distinct()))

你试过了吗?这是可读的还是有效的?不。这只是一个很好的例子,LINQ有时可能会更改为
dicUnion[item.Key]=(dicUnion[item.Key]??+++item.Value).Trim()
如果存储的值为
null
且键和值相等,则避免出现问题?@Denisrepon:是的,然后是什么?你的问题没有提到这个案例,也没有提到应该发生什么。我的方法会成功的them@TimSchmelter好啊谢谢我会试着把情况弄清楚join@Denisrepon:什么条件,什么连接?@TimSchmelter dic1.Where(x=>dic2.ContainsKey(x.Key)和&!dic2.ContainsValue(x.Value))。选择(…)。。
var union = from kv1 in dic1
            join kv2 in dic2
            on kv1.Key equals kv2.Key into keyGroup
            where keyGroup.Any()
            select new KeyValuePair<string, string>(kv1.Key, string.Join(" ", keyGroup.Select(kv => kv.Value)));

Dictionary<string, string> dicUnion = union.ToDictionary(kv => kv.Key, kv => kv.Value);
var keyLookup = dic1.Concat(dic2).ToLookup(kv => kv.Key, kv => kv.Value);
List<string> values = keyLookup["KKK"].ToList();
var res = dic1.Join(dic2, o1 => o1.Key, o2 => o2.Key, (o1, o2) => new { o1.Key, Value1 = o1.Value, Value2 = o2.Value});
dic1.Concat(dic2)
    .ToLookup(o => o.Key, o => o.Value)
    .ToDictionary(o => o.Key, o => string.Join(" ", o.Distinct()))