Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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#_Dictionary_Key_Intersect - Fatal编程技术网

c#词典相交

c#词典相交,c#,dictionary,key,intersect,C#,Dictionary,Key,Intersect,我有一个关于Linq/Lambda和以下问题的问题: 我有两本字典,小学和中学。。。这两个字典定义为Key=string,Value=int。如果键与辅助字典相交,我需要修剪主字典 i、 e: 我的尝试: resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys).ToDictionary(t => t.Key, t.Value); 这显然不起作用,因为primaryDict.Keys.Intersect正在返回一个键列表。。。

我有一个关于Linq/Lambda和以下问题的问题:

我有两本字典,小学和中学。。。这两个字典定义为Key=string,Value=int。如果键与辅助字典相交,我需要修剪主字典

i、 e:

我的尝试:

resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys).ToDictionary(t => t.Key, t.Value);
这显然不起作用,因为primaryDict.Keys.Intersect正在返回一个键列表。。。我该如何重新建立一本新词典,或将主词典配对?任何帮助都将不胜感激。

未经测试:

resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys).ToDictionary(t => t.Key, primaryDict[t.Key]);

您仍然可以在Linq语句中使用
primaryDict
,因为您正在创建一个新的字典,该字典仅在创建变量后才会分配给变量:

resultDict = primaryDict.Keys
                        .Intersect(secondaryDict.Keys)
                        .ToDictionary(t => t, primaryDict[t]);

你可以这样做:

resultDict =  primaryDict.Keys.Intersect(secondaryDict.Keys)
                              .ToDictionary(t => t, t => primaryDict[t]);
或者,或者:

resultDict =  primaryDict.Where(x => secondaryDict.ContainsKey(x.Key))
                         .ToDictionary(x => x.Key, x => x.Value);
后者的效率可能稍高一些,因为它避免了创建一次性集合(由Intersect方法生成的集合),并且不需要通过键再次访问
primaryDict

编辑(根据评论):


如果您想选择一个对象,该对象具有两个字典的“值”,因为这可能是您想要的,那么您可以尝试这样的方法。假设两个字典的键相同,即映射到一起,就像两个系统之间的GUID一样

dictA.Keys.Intersect(dictB.Keys).Select(x => new MyMappingClass
{
    dictAValue= dictA[x], dictBValue= dictB[x]
})

我认为最后一个版本要好得多,因为我不认为将字典视为IEnumerable将利用字典,并将在O(n)时间内运行。这对我正在做的工作非常有效。。。我使用了第二种解决方案,一切都按预期进行。你太棒了,戴夫!作为后续行动。。。可以将同一表达式中的值求和吗?@StewartBasterash:primaryDict中的值与secondaryDict中具有相同键的值求和吗?是的。。。我正在捕获和评估不同领域的数据。不同的字典维护给定域的数据。。。键表示该域中的一个元素,值是它在该域中的显示方式。。。我正在尝试做一些额外的计算。。。我需要基于每个键的值,跨多个域(字典)对给定元素(键)进行统计分析。。。我希望这有意义?
resultDict =  
primaryDict.Where(x => secondaryDict.ContainsKey(x.Key))
           .ToDictionary(x => x.Key, x => x.Value + secondaryDict[x.Key]);
dictA.Keys.Intersect(dictB.Keys).Select(x => new MyMappingClass
{
    dictAValue= dictA[x], dictBValue= dictB[x]
})