Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何连接两本词典?_C#_.net_Dictionary - Fatal编程技术网

C# 如何连接两本词典?

C# 如何连接两本词典?,c#,.net,dictionary,C#,.net,Dictionary,我有两本字典。如果dict2中的值相同,那么我们必须添加dict1中匹配键的值,并在结果字典中生成一个结果,如下所示 **dict1** **dict2** Id value Id value 24379 348 24379 270451 24368 348

我有两本字典。如果dict2中的值相同,那么我们必须添加dict1中匹配键的值,并在结果字典中生成一个结果,如下所示

**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,而不是在一起添加东西。@PatrickHofman
dict2
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;
}