【问题标题】:Linq: Except on two different types of dictionariesLinq:除了两种不同类型的字典
【发布时间】:2012-07-25 15:24:23
【问题描述】:

我有两种不同类型的字典 Dictionary<int, Fooclass> oldDicDictionary<int, string> barList newDic 。现在我需要比较两个字典中的值。例如键可以在

  • oldDic : 1,2,3
  • newDic : 1,2,3,4
  • 预期输出:4

现在我需要根据它们的键比较两个字典 任何帮助将不胜感激。

编辑: 输出应该像第二个字典(newDic),但这将包含第二个字典(oldDic)的一些值。例如

1,"fooString" 其中 fooString 是 Fooclass 的 someproperty 中的某个值...。 为了更清楚,请参阅这对我不起作用

var addedList = from list1 in baseListDic
join list2 in trackerlist on list1.Key equals list2.Key
 select new { key = list1.Key, value = list1.Value._lead };

这里 baseListDic 是 oldDic 而 trackerlist 是 newDic.... 如果我仍然不清楚,请告诉我...

【问题讨论】:

  • IEnumerable 结果 = newDic.Keys.Except(oldDic.Keys)
  • @huMptyduMpty 好吧,我已经尝试过了,但是这个只给了我 4 个输出。但是我还需要 fooClass 的一些值...请参阅上面帖子中的新编辑..
  • 您的新编辑似乎与您的原始示例不一致。在您的原始文件中,您返回的是 newdic 但不是旧 dic 中的键,但在第二个示例中,您似乎返回 olddic 中具有 newdic 键的值?也许创建一个带有一些示例字典的小程序来演示您想要什么?没有人会反对你给他们一些可以轻松运行的代码...... :)
  • @Chris 好吧,是的,你是对的......根据第一个例子,我的要求似乎不同......但在我的新编辑中......我写了一些匹配两个字典中类似键的东西,比如内部连接,这是一个失败的代码,所以我只是发布了这个作为示例,我的输出应该是什么......

标签: c# .net linq linq-to-objects


【解决方案1】:

在新字典的基础上创建一个新字典会更容易,而忽略旧字典中具有相同键的项目。

var result = newDic
    .Where(kvp => !oldDic.ContainsKey(kvp.Key))
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

【讨论】:

    【解决方案2】:

    注意:尽管您的问题是“我需要比较两个字典中的 ”(强调我的),但您的示例似乎只是在演示键的比较,所以我已经同意了。如果是您需要比较的值,您可能想举例说明您的意思以及它们是否易于转换或可比较...

    如果您只是实际比较键,那么您可以使用字典的 .Keys 属性,它返回一个 IEnumerable<TKey>,您可以在上面执行 linq...

    例如:

    var expectedOutput = newDic.Keys.Except(oldDic.Keys);
    

    这确实依赖于相同类型的密钥,但如果您进行比较,这不言而喻。当然,没有什么能阻止你先转换它们的类型,如果你想用不同的类型来做这件事。

    此外,如果您想获取其中一个字典中的值,您可以执行以下操作:

    var newDicValues = expectedoutput.Select(x=>newDic[x]);
    

    或者,你知道,做任何其他你喜欢的事情。 :)

    【讨论】:

      【解决方案3】:

      试试这个来区分两个不同的列表:如果它们有任何共同的属性。

       var differentItems = List<Type1>.Select(d => d.Name)
                              .Except(List<Type2>.Select(d => d.Name));
      

      【讨论】:

        【解决方案4】:

        如果理解正确,试试这样的

        如果你有一个单独的字典,像这样Dictionary&lt;int, Fooclass&gt; FinalDict

                    IEnumerable<int> list = OldDic.Keys.Except(NewDic.Keys);
                    foreach (var x in list)
                    {
                        var value =new MyClass();
                        OldDic.TryGetValue(x,out value );
                        FinalDict.Add(x,value);
                    }
        

        所以在名为 FinalDict 的字典中会有键和相关的 Fooclass

        希望对你有帮助

        【讨论】:

        • 因为所有的 x 都来自 oldDic 你不应该需要使用 TryGetvalue ......事实上我认为这会更简单OldDic.Where(x=&gt; !NewDic.ContainsKey(x.Key)).ToDictionary(x=&gt;x.Key, x=&gt;x.Value)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        相关资源
        最近更新 更多