C# 如何连接两本词典?
我有两本字典。如果dict2中的值相同,那么我们必须添加dict1中匹配键的值,并在结果字典中生成一个结果,如下所示C# 如何连接两本词典?,c#,.net,dictionary,C#,.net,Dictionary,我有两本字典。如果dict2中的值相同,那么我们必须添加dict1中匹配键的值,并在结果字典中生成一个结果,如下所示 **dict1** **dict2** Id value Id value 24379 348 24379 270451 24368 348
**dict1** **dict2**
Id value Id value
24379 348 24379 270451
24368 348 24368 270451
24377 90 24377 270450
24366 90 24366 270450
24369 10 24369 270450
24300 25
Result:
24379 696
24368 696
24377 190
24366 190
24369 190
我有以下逻辑,并希望优化此解决方案:
Dictionary<int, int> result = new Dictionary<int, int>();
foreach (int itemKey in dict1.keys)
{
result.add (itemKey, dict1.Where(a => dict2.ContainsKey(a.key)
&& dict2.ContiansKey(itemKey)
&& dict2[a.key] == dict2[itemKey])
.Sum(a => a.value);
}
字典结果=新建字典();
foreach(dict1.keys中的int itemKey)
{
result.add(itemKey,dict1.Where(a=>dict2.ContainsKey(a.key)
&&格言2.康蒂安斯基(itemKey)
&&dict2[a.key]==dict2[itemKey])
.Sum(a=>a.value);
}
您可以通过两个步骤完成:
- 准备一本字典,以便通过
的值查找值dict2
- 浏览
,并插入查找字典中的值dict1
var lookup = dict1
.Where(p => dict2.ContainsKey(p.Key))
.GroupBy(p => dict2[p.Key])
.ToDictionary(g => g.Key, g => g.Sum(p => p.Value));
var res = dict1.Keys
.Where(k => dict2.ContainsKey(k))
.ToDictionary(k => k, k => lookup[dict2[k]]);
如果您不确定
dict1
和dict2
是否具有相同的键,那么这样做可能更容易:
var result = new Dictionary<int, int>();
foreach(var kvp in dict1)
{
int value;
if(dict2.TryGetValue(kvp.Key, out value))
{
result[kvp.Key] = kvp.Value * 2;
}
}
var result=newdictionary();
foreach(dict1中的var kvp)
{
int值;
if(dict2.TryGetValue(kvp.Key,输出值))
{
结果[kvp.Key]=kvp.Value*2;
}
}
这只会增加两个字典中存在的值。如果你的字典很大,你可以使用A,或者考虑使用。
<代码>公共静态空格DICADTEST() { Dictionary dic1=新字典(){24379348}、{24368348}、{24377,90}、{24366,90}; Dictionary dic2=新字典(){24379,270451},{24368,270451},{24377,270450},{24366,270450}; 字典dicResult=dicDD(dic1,dic2); foreach(dicResult中的KeyValuePair kvp) Debug.WriteLine(“{0}{1}”,kvp.Key,kvp.Value); Debug.WriteLine(“”); } 公共静态字典DicAdd(字典dic1,字典dic2) { Dictionary dicResult=新字典(dic1); foreach(dic1.Keys.Where(x=>dic2.Keys.Contains(x))中的int k) dicResult[k]=dicResult[k]+dicResult[k]; 返回结果; } 问题不清楚public static Dictionary<int, int> DicAdd2(Dictionary<int, int> dic1, Dictionary<int, int> dic2)
{
Dictionary<int, int> dicResult = new Dictionary<int, int>();
foreach (KeyValuePair<int, int> kvp in dic1.Where(x => dic2.Keys.Contains(x.Key)))
dicResult.Add(kvp.Key, 2 * kvp.Value);
return dicResult;
}
公共静态字典dicad2(字典dic1,字典dic2)
{
Dictionary dicResult=新字典();
foreach(dic1.Where(x=>dic2.Keys.Contains(x.Key))中的KeyValuePair kvp)
dicsult.Add(kvp.Key,2*kvp.Value);
返回结果;
}
然后我们必须为dict1中的匹配键添加值。我没有从您期望的结果中得到这一结果。似乎您是在乘以2,而不是在一起添加东西。@PatrickHofmandict2
24379和24368
的值都是270451
,所以OP将dict1
中的值相加,这是两个都是348
。那是什么样的设计!真是一团糟@dasblinkenlight@M.kazemAkhgary这正是OP想要的——也许,他无法控制字典中的内容。你所拥有的几乎毫无意义。例如,为什么不至少拥有一个键不在dic2中的字典呢?无法修改字典中的集合meration两个代码不会产生与问题代码相同的结果。请使用dic1=new Dictionary(){24379,1}、{24368,10}、{24377,100}、{24366,1000};
检查它。问题的结果是{24379,11}、{24368,11}、{24377,1100}、{24366,1100}
,您的结果是{24379,2},{ 24368, 20 }, { 24377, 200 }, { 24366, 2000 } }
。我完全不明白OP为什么会接受这一点。问题的英文部分可能不清楚,但C部分对OP想要什么毫无疑问。您的代码忽略了dic2
的值,而是将dic1
中的值乘以2
。这是不正确的,并且生成的答案与OP的代码不同当您稍微更改数字时生成()。如果问题不清楚,我们可以投票结束不清楚您的问题或留下评论。接受这一回答让我感觉,OP的问题也不清楚:o)我正在测试今天给出的解决方案,但在这个场景中Dictionary dic1=newdictionary(){24379348},{24368348},{2437790},{2436690},{2436710};Dictionary dic2=newdictionary(){24379270451},{24368270451},{24377270450},{24366270450},{24367270450};对于24367,我得到的是180,而不是190。我一点也不清楚为什么你会期望190。答案和问题一样好。
public static Dictionary<int, int> DicAdd2(Dictionary<int, int> dic1, Dictionary<int, int> dic2)
{
Dictionary<int, int> dicResult = new Dictionary<int, int>();
foreach (KeyValuePair<int, int> kvp in dic1.Where(x => dic2.Keys.Contains(x.Key)))
dicResult.Add(kvp.Key, 2 * kvp.Value);
return dicResult;
}