2013-04-09 9 views
0

У меня есть следующий класс:ObservableCollection <class name> .distinct() не работает

public class MapsDescModel : NotificationObject, IEqualityComparer<MapsDescModel> 
{ 
    public MapsDescModel(ObservableCollection<MainCategories> mainCategoty) 
    { 
     MainCategories = mainCategoty; 
    } 

    private MainCategories _mainCategorySelectedItem; 
    public MainCategories MainCategorySelectedItem 
    { 
     get { return _mainCategorySelectedItem; } 
     set 
     { 
      if (Equals(value, _mainCategorySelectedItem)) return; 
      _mainCategorySelectedItem = value; 
      RaisePropertyChanged("MainCategorySelectedItem"); 
      RaisePropertyChanged("SubCategories"); 
     } 
    } 

    private SubCategories _subCategorySelectedItem; 
    public SubCategories SubCategorySelectedItem 
    { 
     get { return _subCategorySelectedItem; } 
     set 
     { 
      if (Equals(value, _subCategorySelectedItem)) return; 
      _subCategorySelectedItem = value; 
      RaisePropertyChanged("SubCategorySelectedItem"); 
     } 
    } 

    private ObservableCollection<MainCategories> _mainCategories; 
    public ObservableCollection<MainCategories> MainCategories 
    { 
     get { return _mainCategories; } 
     set 
     { 
      if (Equals(value, _mainCategories)) return; 
      _mainCategories = value; 
      RaisePropertyChanged("MainCategories"); 
     } 
    } 

    public ObservableCollection<SubCategories> SubCategories 
    { 
     get 
     { 
      if (MainCategorySelectedItem != null) 
       return 
        Infrastructure.Helpers.ExtensionMethods.ToObservableCollection(
         MainCategorySelectedItem.SubCategory.AsEnumerable()); 
      else return new ObservableCollection<SubCategories>(); 
     } 
    } 


    public bool Equals(MapsDescModel x, MapsDescModel y) 
    { 
     return 
      x.MainCategorySelectedItem.MainCatID == y.MainCategorySelectedItem.MainCatID && 
      x.SubCategorySelectedItem.SubCatID == y.SubCategorySelectedItem.SubCatID; 
    } 

    public int GetHashCode(MapsDescModel obj) 
    { 
     if (Object.ReferenceEquals(obj, null)) return 0; 

     if (obj.MainCategorySelectedItem == null || obj.SubCategorySelectedItem == null) 
      return 0; 
     else return obj.MainCategorySelectedItem.Category.GetHashCode() + obj.SubCategorySelectedItem.Category.GetHashCode(); 
    } 
} 

И у меня есть следующий сбор в другом классе:

MapsGrid = new ObservableCollection<MapsDescModel>() 

Я пытаюсь использовать метод MapGrid.Distinct() но он не работает должным образом.

Недвижимость MainCatID и SubCatID являются Integer s. Когда я вставляю в объект 2 объекта с одинаковыми значениями свойств и использую метод Distinct, ничего не происходит. Я проверяю по коду (Console.WriteLine(MapsGrid[0].Equals(MapsGrid[1]));), что сравнение возвращает, и возвращает false, даже свойства равны. Где моя ошибка?


Update:

Я редактировал MapsDescModel класс:

public class MapsDescModel : NotificationObject, IEqualityComparer<MapsDescModel>, IEquatable<MapsDescModel> 
    { 
     public MapsDescModel(ObservableCollection<MainCategories> mainCategoty) 
     { 
      MainCategories = mainCategoty; 

     } 



     private MainCategories _mainCategorySelectedItem; 
     public MainCategories MainCategorySelectedItem 
     { 
      get { return _mainCategorySelectedItem; } 
      set 
      { 
       if (Equals(value, _mainCategorySelectedItem)) return; 
       _mainCategorySelectedItem = value; 
       RaisePropertyChanged("MainCategorySelectedItem"); 
       RaisePropertyChanged("SubCategories"); 
      } 
     } 

     private SubCategories _subCategorySelectedItem; 
     public SubCategories SubCategorySelectedItem 
     { 
      get { return _subCategorySelectedItem; } 
      set 
      { 
       if (Equals(value, _subCategorySelectedItem)) return; 
       _subCategorySelectedItem = value; 
       RaisePropertyChanged("SubCategorySelectedItem"); 
      } 
     } 


     private ObservableCollection<MainCategories> _mainCategories; 
     public ObservableCollection<MainCategories> MainCategories 
     { 
      get { return _mainCategories; } 
      set 
      { 
       if (Equals(value, _mainCategories)) return; 
       _mainCategories = value; 
       RaisePropertyChanged("MainCategories"); 
      } 
     } 

     public ObservableCollection<SubCategories> SubCategories 
     { 
      get 
      { 
       if (MainCategorySelectedItem != null) 
        return 
         Infrastructure.Helpers.ExtensionMethods.ToObservableCollection(
          MainCategorySelectedItem.SubCategory.AsEnumerable()); 
       else return new ObservableCollection<SubCategories>(); 
      } 
     } 


     public bool Equals(MapsDescModel x, MapsDescModel y) 
     { 
      if (x.MainCategorySelectedItem == null || x.SubCategorySelectedItem == null || 
       y.MainCategorySelectedItem == null || y.SubCategorySelectedItem == null) 
       return false; 

      return 
       x.MainCategorySelectedItem.MainCatID == y.MainCategorySelectedItem.MainCatID && 
       x.SubCategorySelectedItem.SubCatID == y.SubCategorySelectedItem.SubCatID; 
     } 

     public int GetHashCode(MapsDescModel obj) 
     { 
      if (Object.ReferenceEquals(obj, null)) return 0; 

      if (obj.MainCategorySelectedItem == null || obj.SubCategorySelectedItem == null) 
       return 0; 
      else return obj.MainCategorySelectedItem.Category.GetHashCode() + obj.SubCategorySelectedItem.Category.GetHashCode(); 
     } 

     public bool Equals(MapsDescModel other) 
     { 
      return 
      this.Equals(this, other); // use definition from IEqualityComparer<T> 
     } 

     public override bool Equals(object obj) 
     { 
      MapsDescModel other = obj as MapsDescModel; 
      if (other == null) 
       return base.Equals(obj); 
      else 
       return this.Equals(other); 
     } 

     public override int GetHashCode() 
     { 
      MapsDescModel other = this as MapsDescModel; 
      if (other == null) 
       return base.GetHashCode(); 
      else 
       return this.GetHashCode(other); 
     } 

и теперь, когда я выполнения самостоятельного метода он до сих пор не работает. Я знаю, что мой метод Equality работает, потому что строка Console.WriteLine (MapsGrid [0] .Equals (MapsGrid [1])); возвращает true.

Любые идеи?

+1

Возможно, вы говорите глупость, но, возможно, вам нужно поставить ключевое слово 'override' перед' bool Equals' и 'int GetHashCode'? –

+0

нет этого не может быть проблемой. подписи методов отличаются от методов Object (обратите внимание, что эти методы получают параметр MapDescModel в качестве входных данных) – Ofir

+0

@ConradClark - нет, OP реализует 'IEqualityComparer ', не переопределяя методы 'object'. –

ответ

1

Вы внедрили IEqualityComparer<T>, что это хорошо, если вы хотите передать в экземпляр вашего класса Distinct:

var distinctList = MapGrid.Distinct(new MapsDescModel()); 

Однако уборщик метод для реализации IEquatable<T> вместо этого, так как Distinct будет использовать что по умолчанию, если вы не Передавайте IEqualityComparer<T>:

public class MapsDescModel : NotificationObject, IEqualityComparer<MapsDescModel>, IEquatable<MapsDescModel> 
{ 
... 
    public bool Equals(MapsDescModel y) 
    { 
     return 
      this.Equals(this,y); // use definition from IEqualityComparer<T> 
    } 
} 

Я также рекомендовал бы перекрывая object.Equals и object.GetHashCode для согласованности, снова используя методы IEqualityComparer, если хотите (или просто преобразование методов IEqualityComparer в переопределение, если вы решите, что они вам больше не нужны).

+0

Я сделал это, теперь метод равенства возвращает true, но отличительные все еще не работают - см. Мое обновление выше – Ofir

1

Если вы хотите получить помощь, ответьте на заданные вопросы.

Выполняется ли переопределение bool Equals (объект obj) и что он возвращает?
Ваш ответ не смог ответить на этот очень важный вопрос.

Поскольку вы не реализуете объект Я подозреваю, эти переопределяет не называются

Implementing the Equals Method

Вы подаете IEqualityComparer к классу (MapsDescModel), и это относится к коллекции

IEqualityComparer Interface

Я думаю, что вам нужно сделать (или сделать это), это OverRide GetHashCode и Equals на классе MainCategories
Но вы не выкладываете определение MainCategories
И я нахожу PLUR (а) интересного - это

public ObservableCollection<MainCategories> MainCategories 

коллекция из коллекции?
Рассмотрите возможность наименования свойства название класса для ясности

+0

Я не переопределял ничего в MainCategories. обратите внимание, что в моем методе equals я сравниваю только целые числа. У меня есть комментарий о названии - вы правы – Ofir

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

  • Нет связанных вопросов^_^