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

标签 c# linq

这是我的问题:

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

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 的列表,其属性 NameType 标识可能更改的对象和属性 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/

相关文章:

c# - LINQ 项目属性转换为包含的新匿名类型

c# - 通过代码在 MTM 中执行测试

c# - 使用 XML 序列化反序列化数组时不期望元素

c# - 发送应用程序电子邮件的方法 - SMTP 与 Exchange Web 服务

c# - 使用查询表达式对 List<T> 进行排序

c# - 无法使用 Int64 转换类型为 System.Func`2 的对象

c# - LINQ 加入两个数据表

c# - 使用 LINQ 从不同的组中选择重复值

c# - WCF 中的证书验证

c# - 如何让 C# 中的进程(而不是线程)同步文件系统访问