2016-09-21 13 views
1

私は自分のprivate List<MaintenanceWindow> tempMaintenanceWindowsをDatagridにバインドし、ユーザーがDatagrid内の項目を編集し、新しい項目を追加できるようにしました。これは正常に動作します。C#WPF Compare List <T> to 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 }); 

私はそうのように2を比較:

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

が、SequenceEqualの結果は常にあると思われますfalseですが、コードをデバッグするときはまったく同じようです。

誰かが助けてくれることを願っています。ありがとう。


クエンティン・ロジャーは動作しますが、私はおそらくそれを行うにneatest方法ではありませんが、それはアプリケーションの私の場合にフィットする私のコードを投稿したいアプローチのソリューションを提供します。

だからこれは私が私のMaintenanceWindowオブジェクトのEqualsメソッドオーバーライドする方法です:デフォルトSequenceEqualでは

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に対してequalsをオーバーライドしましたか? –

+0

デフォルトの比較元は、tempElement1.Equals(gridElement1)のように比較しますか?いいえ、私はそれを無効にしませんでした。したがって、オーバーライドメソッドでは、私は自分のMaintenanceWindowクラスのすべてのフィールドを比較する必要がありますか? – jera

+1

すべての重要なフィールドを正確に比較する必要があります。 –

答えて

1

あなたは、このようなあなたのMaintenanceWindowを宣言する場合:私はあなたがすべての重要なfields.In私は説明を選んだ次の実装を比較する必要があるので、2つの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; 
    } 
} 
2

は、あなたが等しいをオーバーライドするか、同等の機能を呼び出して各項目を比較するのだろうか?それ以外の場合は、クラスのメモリアドレスを比較します。

また、不変なリストの比較をお探しの場合は、FSharpListを使用することをお勧めします。

[はい、すべての意味のあるフィールドを比較する必要が

「オーバーライドメソッド内だから私は私の MaintenanceWindowクラスのすべての単一のフィールドを比較する必要があります」。