C# 使用字典中的相同键连接值<;字符串,字符串>;
我需要合并两本字典。它们具有相同的键(KKK)和不同的值: dic2: 工会: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
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()))