10

我有 2 种不同类型的字典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 .... 如果我还不清楚,请告诉我...

4

4 回答 4

15

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

var result = newDic
    .Where(kvp => !oldDic.ContainsKey(kvp.Key))
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
于 2012-07-25T16:16:34.057 回答
6

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

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

例如:

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

这确实依赖于相同类型的密钥,但如果您正在比较,这不言而喻。当然,如果您使用不同的类型来执行此操作,则没有什么能阻止您首先转换它们的类型。

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

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

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

于 2012-07-25T15:30:14.013 回答
2

试试这个来获得两个不同列表之间的区别:如果它们有任何共同的属性。

 var differentItems = List<Type1>.Select(d => d.Name)
                        .Except(List<Type2>.Select(d => d.Name));
于 2013-05-15T10:47:27.870 回答
0

如果理解正确,请尝试这样的事情

如果你有一个单独的字典像这样Dictionary<int, Fooclass> 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的 Dictionary中会有键和相关的Fooclass

希望这可以帮助

于 2012-07-25T16:07:43.983 回答