使用两个词典与LINQ我相信我的问题是不同的,因为我在问如何以特定方式组合两个词典:我想要Dictionary1中的所有项目加上Dictionary2中不存在的所有项目(即键不存在)。我有两个这样的字典:vard1=newDictionary();vard2=newDictionary();d1[“一个”]=1;d1[“b”]=2;d1["c"]=3;d2[“a”]=11;d2[“e”]=12;d2[“c”]=13;我想将它们组合成一个新的字典(从技术上讲,它不必是一个字典,它可以只是一个键值对序列),这样输出就包含d1中的所有键值对,并且只包含d2中的键值对,其键不包含出现在d1。概念:vard3=d1.Concat(d2.Except(d1))但这给了我d1和d2的所有元素。看起来应该很明显,但我一定遗漏了一些东西。默认情况下使用Except时,它使用默认的相等比较器KeyValuePair类型来比较键和值。你可以这样做:vard3=d1.Concat(d2.Where(kvp=>!d1.ContainsKey(kvp.Key)));vard3=d1.Concat(d2.Where(kvp=>!d1.ContainsKey(kvp.Key))).ToDictionary(x=>x.Key,x=>x.Value);这对我有用。JonSkeet(像往常一样)有一个扩展方法允许你这样做:我可以指定我的显式类型比较器是内联的吗?好吧,我不知道这是否是LinQ中的新功能,但这正是.Union()所做的:vard3=d1.Union(d2);当然,对于字典,你必须提供一个自定义的相等比较器来匹配键:}publicintGetHashCode(KeyValuePairx){returnx.GetHashCode();然后:vard3=d1.Union(d2,newKeyValuePairComparer());在您的示例中,输出将是(在C#交互式测试中):>d1.Union(d2,newKeyValuePairComparer())UnionIterator{{"a",1},{"b",2},{"c",3},{"e",12}}注意区别:>d2.Union(d1,newKeyValuePairComparer())UnionIterator{{"a",11},{"e",12},{"c",13},{"b",2}}您也可以使用自己的IEqualityComparer。一个例子如下:}publicintGetHashCode(KeyValuePairobj){returnobj.Key.GetHashCode();}}...字典d1=newDictionary();d1.Add("A","B");d1.Add("C","D");字典d2=新字典();d2.添加(“E”,“F”);d2.添加(“A”,“D”);d2.添加(“G”,“H”);MyComparer比较器=newMyComparer();变量d3=d1。Concat(d2.Except(d1,比较器));foreach(varaind3){Console.WriteLine("{0}:{1}",a.Key,a.Value);}使用自己的IEqualityComparerelse类似@bitxwise和@DaveShaw的答案的解决方案,但是没有使用Except(),这样更简单:以上就是C#学习教程的全部内容:使用LINQ的两个字典,如果对大家有帮助的话有用,需要了解更多的C#学习教程,希望大家多多关注—vard3=d1.Concat(d2).Distinct(newMyComparer());本文收集自网络,不代表立场。如涉及侵权,请点击右侧管理员删除。如需转载请注明出处:
