Linq:除了两种不同类型的词典

May*_*hak 9 .net c# linq linq-to-objects

我有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的某些属性中的一些值....为了更清晰,请看这对我不起作用

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 };
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*ado 13

基于新词典创建新词典会更容易,忽略旧词典中具有相同键的项目.

var result = newDic
    .Where(kvp => !oldDic.ContainsKey(kvp.Key))
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 6

注意:尽管你的问题是"我需要比较两个词典中的 "(强调我的),你的例子似乎只是证明了键的比较,所以我已经去了.如果它是您需要比较的值,您可能想要举例说明您的意思以及它们是否易于转换或可比较......

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

例如:

var expectedOutput = newDic.Keys.Except(oldDic.Keys);
Run Code Online (Sandbox Code Playgroud)

这确实依赖于键是相同的类型,但如果你正在比较,这是不言而喻的.当然,没有什么能阻止你首先转换他们的类型,如果你用不同的类型做这个.

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

var newDicValues = expectedoutput.Select(x=>newDic[x]);
Run Code Online (Sandbox Code Playgroud)

或者,你知道,做任何其他你想要的linqy东西.:)