2016-09-21 3 views
1

Я связал свой private List<MaintenanceWindow> tempMaintenanceWindows с Datagrid и разрешил пользователю редактировать элементы в Datagrid, а также добавлять новые элементы. Это прекрасно работает.C# Список сравнения WPF <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 }); 

Я сравниваю два так:

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

но результат SequenceEqual всегда, кажется, false, хотя при отладке кода они кажутся точно такими же.

Надеюсь, кто-то может помочь. Благодарю.


Квентин Roger представил решение подхода, который работает, но я хочу, чтобы опубликовать мой код, который, вероятно, не опрятный способом сделать это, но он подходит к моему случаю применения.

Так вот как я отменяю метод Equals моего объекта MaintenanceWindow:

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 они будут считать равно, и 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»

Вы должны сравнить все значимые поля, да.

Смежные вопросы