C# 词典相交
本文关键字: | 更新日期: 2023-09-27 18:34:54
我有一个关于Linq/Lambda的问题和以下问题:
我有两本词典,主要和次要...这两个字典被定义为键=字符串,值=整数。如果 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 正在返回一个键列表......如何重新建立新词典,或配对主词典?任何帮助将不胜感激。
你可以
这样做:
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]);
您仍然可以在 Linq 语句中使用primaryDict
,因为您正在创建一个新字典,该字典仅在创建后分配给您的变量:
resultDict = primaryDict.Keys
.Intersect(secondaryDict.Keys)
.ToDictionary(t => t, primaryDict[t]);
未经测试:
resultDict = primaryDict.Keys.Intersect(secondaryDict.Keys).ToDictionary(t => t.Key, primaryDict[t.Key]);
如果你想选择一个具有两个字典的"值"的对象,因为你可能想要的,你可以尝试这样的东西。假设两个字典的键相同,即每个词典映射在一起,就像两个系统之间的 GUID 一样
dictA.Keys.Intersect(dictB.Keys).Select(x => new MyMappingClass
{
dictAValue= dictA[x], dictBValue= dictB[x]
})