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

时间:2012-07-25 15:24:24

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

我有两种不同类型的词典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 };

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

4 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:6)

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

如果您只是实际比较了这些键,那么您可以使用字典的.Keys属性返回IEnumerable<TKey>,您可以使用它来执行您的linq ...

例如:

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

这确实依赖于相同类型的密钥,但如果您正在进行比较,则不言而喻。当然,没有什么可以阻止你首先转换他们的类型,如果你用不同的类型做这个。

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

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分: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 的词典中将包含密钥和相关的 Fooclass

希望这有帮助