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

时间:2011-11-24 18:48:10

标签: c# linq

这是我的问题:

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

Dictionary<string, List<Object>> Existing
Dictionary<string, List<Object>> New

基本上我需要做的是首先根据键找到New中但不在Existing中的任何List<Object>,然后找到New中包含的每个List<Object>中不存在的任何Object在现有的相应List<Object>中,或者根据Object中的许多属性进行更改,当然还有字典键。

我目前正在通过循环和单独检查每个对象来做到这一点,但我认为必须有一个更好的方法来使用LINQ。

希望这很清楚,但如果您需要进一步的信息,请告诉我。

感谢。

2 个答案:

答案 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完成。