c# WPF比较列表Datagrid.ItemsSource

本文关键字:Datagrid ItemsSource WPF 比较 列表 | 更新日期: 2023-09-27 18:08:20

我将private List<MaintenanceWindow> tempMaintenanceWindows绑定到Datagrid,并允许用户编辑Datagrid中的项目以及添加新项目。

现在我考虑如何回滚用户所做的更改,如果没有按保存按钮先关闭窗口。基本上,我想比较一下Datagrid。ItemsSource到我这样填充的临时列表:

foreach (MaintenanceWindow mainWin in maintenanceWindowList)
                tempMaintenanceWindows.Add(new MaintenanceWindow {from = mainWin.from, to = mainWin.to, abbreviation = mainWin.abbreviation, description = mainWin.description, hosts = mainWin.hosts });

我像这样比较两者:

if (!tempMaintenanceWindows.SequenceEqual((List<MaintenanceWindow>)mainWinList.ItemsSource))

但是SequenceEqual的结果似乎总是为假,尽管在调试代码时,它们似乎是完全相同的事情。

希望有人能帮忙。谢谢。


Quentin Roger提供了一个可行的方法解决方案,但我想发布我的代码,这可能不是最简洁的方法,但它适合我的应用程序。

所以这就是我如何覆盖我的MaintenanceWindow对象的Equals方法:

public override bool Equals (object obj)
        {
            MaintenanceWindow item = obj as MaintenanceWindow;
            if (!item.from.Equals(this.from))
                return false;
            if (!item.to.Equals(this.to))
                return false;
            if (!item.description.Equals(this.description))
                return false;
            if (!item.abbreviation.Equals(this.abbreviation))
                return false;
            if (item.hosts != null)
            {
                if (!item.hosts.Equals(this.hosts))
                    return false;
            }
            else
            {
                if (this.hosts != null)
                    return false;
            }
            return true;
        }

c# WPF比较列表<T>Datagrid.ItemsSource

默认情况下SequenceEqual将比较调用equal函数的每个项,您是否重写了equal?否则,它比较一个类的内存地址。

我也鼓励你在寻找不可变列表比较时使用FSharpList。

"那么在override方法中,我是否需要比较我的维护窗口类"

你必须比较每个有意义的字段,是的。

如果你像这样声明你的MaintenanceWindow:

正如我在评论中所说的,你必须比较每个重要的字段。在下面的实现中,我选择了description,所以如果两个MaintenanceWindow得到相同的description,它们将被认为是相等的,SequenceEquals将按预期工作。

 internal class MaintenanceWindow
 {
    public object @from { get; set; }
    public object to { get; set; }
    public object abbreviation { get; set; }
    private readonly string _description;
    public string Description => _description;
    public MaintenanceWindow(string description)
    {
        _description = description;
    }
    public string hosts { get; set; }
    public override bool Equals(object obj)
    {
        return this.Equals((MaintenanceWindow)obj);
    }
    protected bool Equals(MaintenanceWindow other)
    {
        return string.Equals(_description, other._description);
    }
    public override int GetHashCode()
    {
        return _description?.GetHashCode() ?? 0;
    }
}