Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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# LINQ-比较列表字典以查找新对象和更改的对象_C#_Linq - Fatal编程技术网

C# LINQ-比较列表字典以查找新对象和更改的对象

C# LINQ-比较列表字典以查找新对象和更改的对象,c#,linq,C#,Linq,我的问题是: 我有两本结构相同的词典: Dictionary<string, List<Object>> Existing Dictionary<string, List<Object>> New 字典已存在 新词典 基本上,我需要做的是首先根据键查找任何新的但不存在的列表,然后在每个列表中查找包含在新列表中的任何对象,这些对象在其相应的列表中不存在,或者根据对象中的许多属性进行更改,当然,字典钥匙 我目前正在通过循环和逐个检查每个对象来实现这

我的问题是:

我有两本结构相同的词典:

Dictionary<string, List<Object>> Existing
Dictionary<string, List<Object>> New
字典已存在
新词典
基本上,我需要做的是首先根据键查找任何新的但不存在的
列表
,然后在每个
列表
中查找包含在新列表中的任何对象,这些对象在其相应的
列表
中不存在,或者根据对象中的许多属性进行更改,当然,字典钥匙

我目前正在通过循环和逐个检查每个对象来实现这一点,但我认为一定有更好的方法使用LINQ实现这一点

希望这是明确的,但让我知道,如果你需要进一步的信息


谢谢。

至于字典中的新条目和条目的
列表中的新对象

这将生成一个对象序列,每个对象都包含发现差异的字典的键、现有对象和新对象。相同的对象将不会包含在结果中。

Dictionary New=New Dictionary();
Dictionary<string, int> New = new Dictionary<string, int>();
Dictionary<string, int> Existing = new Dictionary<string, int>();

New.Add("A", 100);
New.Add("B", 200);
New.Add("Y", 300);
New.Add("X", 400);


Existing.Add("A", 1);
Existing.Add("B", 2);
Existing.Add("C", 3);
Existing.Add("D", 4);
Existing.Add("E", 5);
Existing.Add("F", 6);
Existing.Add("G", 7);
Existing.Add("H", 8);

var newStuff = New.Where(n => !Existing.ContainsKey(n.Key)).ToList();
var updatedStuff = Existing.Where(e => New.ContainsKey(e.Key) && e.Value != New.Single(n => n.Key == e.Key).Value);


newStuff.Dump();
updatedStuff.Dump();

//updated and new 
newStuff.AddRange(updatedStuff);
newStuff.Dump();
Dictionary Existing=新Dictionary(); 新的。添加(“A”,100); 新.加入(“B”,200); 新增。添加(“Y”,300); 新.加入(“X”,400); 现有。添加(“A”,1); 现有。添加(“B”,2); 现有。添加(“C”,3); 现有。添加(“D”,4); 现有。添加(“E”,5); 现有。添加(“F”,6); 现有。添加(“G”,7); 现有。添加(“H”,8); var newStuff=New.Where(n=>!Existing.ContainsKey(n.Key)).ToList(); var updatedStuff=Existing.Where(e=>New.ContainsKey(e.Key)&&e.Value!=New.Single(n=>n.Key==e.Key).Value); newStuff.Dump(); updatedStuff.Dump(); //更新的和新的 newStuff.AddRange(updatedStuff); newStuff.Dump();

在林帕德完成

请向我们展示你的代码。是的,基于对象的属性(如名称、类型等)会有相似之处,我基本上会进行比较,看看特定属性是否发生了变化。所以这里
name==name&&type==type&&changedrop!=changedrop
谢谢。看来我有很多关于linq的知识要学。:)
var differences = Existing.Keys.Intersect(New.Keys).SelectMany(key =>
    from existingObj in Existing[key]
    join newObj in New[key] on new { existingObj.Name, existingObj.Type } equals
                               new { newObj.Name, newObj.Type }
    where existingObj.Value != newObj.Value
    select new { Key = key, Existing = existingObj, New = newObj });
Dictionary<string, int> New = new Dictionary<string, int>();
Dictionary<string, int> Existing = new Dictionary<string, int>();

New.Add("A", 100);
New.Add("B", 200);
New.Add("Y", 300);
New.Add("X", 400);


Existing.Add("A", 1);
Existing.Add("B", 2);
Existing.Add("C", 3);
Existing.Add("D", 4);
Existing.Add("E", 5);
Existing.Add("F", 6);
Existing.Add("G", 7);
Existing.Add("H", 8);

var newStuff = New.Where(n => !Existing.ContainsKey(n.Key)).ToList();
var updatedStuff = Existing.Where(e => New.ContainsKey(e.Key) && e.Value != New.Single(n => n.Key == e.Key).Value);


newStuff.Dump();
updatedStuff.Dump();

//updated and new 
newStuff.AddRange(updatedStuff);
newStuff.Dump();