Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较2个列表<;字典<;字符串,对象>&燃气轮机;在c中#_C#_Linq - Fatal编程技术网

C# 比较2个列表<;字典<;字符串,对象>&燃气轮机;在c中#

C# 比较2个列表<;字典<;字符串,对象>&燃气轮机;在c中#,c#,linq,C#,Linq,我有两本字典 List<Dictionary<string,object>> master List<Dictionary<string,object>> sub 但是,这不会返回正确的结果,并且输出为IEnumerable。是否可以通过linq本身获得所需的输出 感谢您的帮助作为警告,您的数据结构很难达到理想状态。既然你把第一个键的第一个值当作你的“KEY”,你可能会想重新创建你的结构来使用你的“SAME1”(和类似的值)作为键。 也就是说,您

我有两本字典

List<Dictionary<string,object>> master
List<Dictionary<string,object>> sub
但是,这不会返回正确的结果,并且输出为IEnumerable。是否可以通过linq本身获得所需的输出


感谢您的帮助

作为警告,您的数据结构很难达到理想状态。既然你把第一个键的第一个值当作你的“KEY”,你可能会想重新创建你的结构来使用你的“SAME1”(和类似的值)作为键。 也就是说,您仍然可以在“单行”LINQ语句中完成这两个查询

var masterOnly = Master.Where(m => 
    !sub.Select(s => s.First().Value).Contains(m.First().Value)
).ToList();
在纯master场景中,我们使用Where子句来允许我们首先构建一个sub->first->值的集合,然后根据该集合检查循环中的每个master->first->值。如果该值不存在,则返回该值

var hasChanged = Master.Where(m => 
    sub.FirstOrDefault(s => 
        s.First().Value == m.First().Value)?.SequenceEqual(m) == false)
    .ToList();
在这种情况下,我们可以利用C#6的null传播运算符来避免需要使用
.ForEach()
在循环中构建匹配,因为如果值为null,我们的SequenceEquals检查将被忽略


在有匹配项的情况下,我们希望显式地将其序列与主集合进行比较,如果有任何条目不匹配,我们将返回它。

您尝试执行的操作相当奇怪。如果按键2搜索,则子列表中的两个词典都是不同的。你可以尝试像Master.SelectMany(x=>x)这样的东西。其中(x=>!sub.SelectMany(z=>z)。选择(z=>z.Key+“#”+z.Value)。包含(x.Key+“#”+x.Value)和&x.Key==“key1”);这会让你的方式,但你可能想重新考虑你的设计的一部分。
NewList.Add(new Dictionary<string, string>(){
{"key1","SAME2"}
{"key2", "value3"},
{"key3","value5"} // since the master dictionary has value5 and the sublist dictionary has value 4 
var result = Master.SelectMany(m=>m).Where(e=>sub.SelectMany(a=>a)
                .Any(p => e.Key == p.Key && p.Value!=null && e.Value!=(p.Value)));
var masterOnly = Master.Where(m => 
    !sub.Select(s => s.First().Value).Contains(m.First().Value)
).ToList();
var hasChanged = Master.Where(m => 
    sub.FirstOrDefault(s => 
        s.First().Value == m.First().Value)?.SequenceEqual(m) == false)
    .ToList();