这是我的问题:
我有两个结构相同的字典:
Dictionary<string, List<Object>> Existing
Dictionary<string, List<Object>> New
基本上我需要做的就是首先找到任何 List<Object>
根据键在 New 中但不在 Existing 中,然后在每个 List<Object>
中找到任何对象包含在 New 中,其对应的 List<Object>
中不存在现有的 或 是根据对象中的许多属性以及字典键进行更改的。
我目前通过单独循环和检查每个对象来完成此操作,但我认为必须有更好的方法使用 LINQ 来完成此操作。
希望这是清楚的,但如果您需要更多信息,请告诉我。
谢谢。
最佳答案
对于字典中的新条目和条目的 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
的列表,其属性 Name
和 Type
标识可能更改的对象和属性 Value
:
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 });
这将生成一个对象序列,每个对象都包含发现差异的字典的键、现有对象和新对象。相同的对象将不会包含在结果中。
关于c# - LINQ - 比较列表字典以查找新的和更改的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8261414/