c#词典相交

时间:2012-05-21 12:18:56

标签: c# dictionary key intersect

我对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正在返回一个键列表...如何重新建立新词典,或者配对主词典?任何帮助将不胜感激。

4 个答案:

答案 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]
})