【问题标题】:c# dictionaries intersectc# 字典相交
【发布时间】:2012-05-27 22:43:52
【问题描述】:

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

我有两个字典,primary 和secondary...这两个字典定义为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 正在返回一个键列表......我将如何重新建立一个新字典,或配对主字典?任何帮助将不胜感激。

【问题讨论】:

    标签: c# dictionary key intersect


    【解决方案1】:

    你可以这样做:

    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]);
    

    【讨论】:

    • 我认为最后一个版本要好得多,因为我认为将字典视为 IEnumerable 不会利用字典,并且会在 O(n) 时间内运行。
    • 这对我正在做的事情非常有效......我使用了第二个解决方案,一切都按预期工作。你摇滚戴夫!
    • 作为后续...是否可以对同一表达式中的值求和?
    • @StewartBasterash:primaryDict 中的值与 secondaryDict 中的值具有相同的键?
    • 是的...我正在跨不同域捕获和评估数据。不同的字典维护给定域的数据......键表示该域中的一个元素,值是它在该域中的呈现方式......我正在尝试做一些额外的计算......我需要根据每个键的值,跨多个域(字典)对给定元素(键)进行统计分析...我希望这有意义吗?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      未经测试:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-04
          • 1970-01-01
          • 2019-07-15
          • 2018-06-11
          • 2017-12-09
          相关资源
          最近更新 更多