首页 > 解决方案 > 比较具有可能已更改的相同对象的 2 个列表

问题描述

我有一堂课:

[Serializable]
public class MyObject
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

而且我有扩展方法,如果对象已更改,则返回:

public static bool IsChanged(this MyObject original, MyObject other)
{
    if (original == null || other == null)
        return false;

    if (original.Id != other.Id)
        return false;

    if (original.Name != other.Name ||
        original.Description != other.Description)
    {
        return true;
    }

    return false;
} 

然后我得到我的对象列表并制作列表的副本,例如:

items = GetMyObjects();
copy = items.DeepCopy();

DeepCopy是一种扩展方法,它使用复制对象,BinaryFormatter以便列表的副本包含新实例而不是引用。

然后,我更改列表中的项目(即它们的名称和/或描述)items,并检查我所做的更改的项目:

var changed = items.Where(x => copy.Any(x2 => x.IsChanged(x2)));

但是,计数changed始终是原始列表中的项目总数,无论任何项目如何或是否发生更改。

我究竟做错了什么?

标签: c#linq

解决方案


基本上你正在做的是检查副本中是否有任何项目与项目列表中的第 i 个项目不同。因此,如果至少有 1 个项目具有不同的名称或描述,则更改项目的计数器将增加,结果将是项目总数。


推荐阅读