我对Linq / Lambda以及以下问题有疑问:
我有两个词典,主要和次要......这两个词典被定义为Key = string,Value = int。如果KEYS与辅助字典相交,我需要修剪主字典。
即:
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正在返回一个键列表...如何重新建立新词典,或者配对主词典?任何帮助将不胜感激。
答案 0 :(得分:22)
你可以这样做:
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]);
答案 1 :(得分:4)
您仍然可以在Linq语句中使用primaryDict
,因为您正在创建一个 new 字典,该字典只有在创建后才会分配给您的变量:
resultDict = primaryDict.Keys
.Intersect(secondaryDict.Keys)
.ToDictionary(t => t, primaryDict[t]);
答案 2 :(得分:2)
未测试:
resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys).ToDictionary(t => t.Key, primaryDict[t.Key]);
答案 3 :(得分:0)
如果您要选择一个带有两个字典的“值”的对象,因为这可能是您想要的,则可以尝试这样的操作。假设两个字典的键是相同的,即将每个键映射在一起,就像两个系统之间的GUID一样
dictA.Keys.Intersect(dictB.Keys).Select(x => new MyMappingClass
{
dictAValue= dictA[x], dictBValue= dictB[x]
})