这是我的问题:
我有两个结构相同的词典:
Dictionary<string, List<Object>> Existing
Dictionary<string, List<Object>> New
基本上我需要做的是首先根据键找到New中但不在Existing中的任何List<Object>
,然后找到New中包含的每个List<Object>
中不存在的任何Object在现有的相应List<Object>
中,或者根据Object中的许多属性进行更改,当然还有字典键。
我目前正在通过循环和单独检查每个对象来做到这一点,但我认为必须有一个更好的方法来使用LINQ。
希望这很清楚,但如果您需要进一步的信息,请告诉我。
感谢。
答案 0 :(得分:3)
对于词典中的新条目和条目List<object>
中的新对象:
List<object>[] addedLists = New.Keys.Except(Existing.Keys)
.Select(key => New[key])
.ToArray();
object[] addedObjects = Existing.Keys.Intersect(New.Keys)
.SelectMany(key => New[key].Except(Existing[key])
.ToArray();
但最后一项要求有点不清楚。您如何定义更改的对象?应该比较哪些对象进行更改?将任何对象与任何其他对象进行比较可能会被定义为不同,因此必须存在一些相似性(例如,ID
属性中具有相同值的对象)。
编辑:正如您在评论中阐明了如何定义对象标识,以下是如何查找所有已更改的对象(假设字典的值是具有属性的Foo
列表{ {1}}和Name
标识可能更改的对象和属性Type
:
Value
这将生成一系列对象,每个对象包含找到差异的字典的键,即现有对象和新对象。相同的对象不会包含在结果中。
答案 1 :(得分:0)
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();
在Linqpad完成。