2016-09-21 38 views
1

我將我的private List<MaintenanceWindow> tempMaintenanceWindows綁定到Datagrid並使用戶能夠編輯Datagrid中的項目以及添加新項目。這工作正常。C#WPF比較列表<T>到Datagrid.ItemsSource

現在我想了解如何在沒有首先按下保存按鈕的情況下關閉窗口來回滾用戶所做的更改。基本上,我想給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的結果似乎總是假,雖然在調試代碼時,它們似乎是完全相同的東西。

希望有人能幫忙。謝謝。


昆汀·羅傑所提供的方法解決方案,它的工作原理,但我想我張貼代碼很可能不是做最巧妙的方法,但它適合我的應用程序的情況下。

所以這就是我不顧我的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; 
     } 
+1

SequenceEqual使用默認比較器,您是否覆蓋了MaintenanceWindow的等號? –

+0

默認比較器,是否意味着它比較像tempElement1.Equals(gridElement1)等?不,我沒有覆蓋它。所以在覆蓋方法中,我必須比較我的MaintenanceWindow類的每個字段嗎? – jera

+1

正是你必須比較每個重要的領域。 –

回答

1

如果你宣佈你MaintenanceWindow這樣的:

正如我在我的評論說你要比較各顯著fields.In以下實現我選擇的描述,所以如果兩個MaintenanceWindow得到了相同的description他們會考慮equals和SequenceEquals ll按預期工作。

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; 
    } 
} 
2

默認SequenceEqual將比較每個項目調用等於功能,你重寫平等的嗎?否則,它比較一個類的內存地址。

另外,我建議您在查找不可變列表比較時使用FSharpList

「所以在覆蓋方法做我必須 我MaintenanceWindow類的每一個領域比較」

你必須每一個有意義的領域進行比較,是的。