16

我对 Linq / Lambda 和以下问题有疑问:

我有两个字典,primary 和secondary...这两个字典定义为Key=string,Value=int。如果 KEYS 与辅助字典相交,我需要修剪主字典。

IE:

primaryDict = ["thing1", 33] ["thing2", 24] ["thing3", 21] ["thing4", 17] ["thing5", 12]

secondaryDict = ["thing1", 22] ["thing3", 20] ["thing4", 19] ["thing7", 17] ["thing9", 10]

resultDict = ["thing1", 33] ["thing3", 21] ["thing4", 17]

我的尝试:

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

这显然不起作用,因为 primaryDict.Keys.Intersect 正在返回一个键列表......我将如何重新建立一个新字典,或配对主字典?任何帮助,将不胜感激。

4

4 回答 4

25

你可以这样做:

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.

编辑(根据评论):

resultDict =  
primaryDict.Where(x => secondaryDict.ContainsKey(x.Key))
           .ToDictionary(x => x.Key, x => x.Value + secondaryDict[x.Key]);
于 2012-05-21T12:24:18.520 回答
4

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

resultDict = primaryDict.Keys
                        .Intersect(secondaryDict.Keys)
                        .ToDictionary(t => t, primaryDict[t]);
于 2012-05-21T12:23:31.483 回答
2

未经测试:

resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys).ToDictionary(t => t.Key, primaryDict[t.Key]);
于 2012-05-21T12:23:31.473 回答
0

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

dictA.Keys.Intersect(dictB.Keys).Select(x => new MyMappingClass
{
    dictAValue= dictA[x], dictBValue= dictB[x]
})
于 2020-06-26T22:45:39.360 回答