8

Я реализовал IEqualityComparer и IEquatable (оба точно), но когда я вызываю метод Distinct() в коллекции, он не вызывает методы, которые приходят с ним. Вот код, который я выполняю при вызове функции Distinct().Distinct() не вызывает методы равных

ObservableCollection<GigViewModel> distinctGigs = new ObservableCollection<GigViewModel>(Gigs.Distinct<GigViewModel>()); 
return distinctGigs; 

Я хочу вернуть ObservableCollection, который не содержит каких-либо двойных объектов, которые находятся в ObservableCollection в «гигов».

Я реализует интерфейсы, как это на классе GigViewModel:

public class GigViewModel : INotifyPropertyChanged, IEqualityComparer<GigViewModel>, IEquatable<GigViewModel> 
{ 
    .... 
} 

И переопределить методы, которые приходят с интерфейсами, как так:

public bool Equals(GigViewModel x, GigViewModel y) 
{   
    if (x.Artiest.Naam == y.Artiest.Naam) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

public int GetHashCode(GigViewModel obj) 
{ 
    return obj.Artiest.Naam.GetHashCode(); 
} 

public bool Equals(GigViewModel other) 
{ 
    if (other.Artiest.Naam == this.Artiest.Naam) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Спасибо за помощь я получаю , Поэтому я создал отдельный класс, который реализует IEqualityComparer и передал его экземпляр в метод disctinct. Но методы все еще не запускаются.

EqualityComparer:

class GigViewModelComparer : IEqualityComparer<GigViewModel> 
{ 
    public bool Equals(GigViewModel x, GigViewModel y) 
    { 

     if (x.Artiest.Naam == y.Artiest.Naam) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public int GetHashCode(GigViewModel obj) 
    { 
     return obj.Artiest.Naam.GetHashCode(); 
    } 
} 

Distinct() вызов:

GigViewModelComparer comp = new GigViewModelComparer(); 
ObservableCollection<GigViewModel> distinctGigs = new ObservableCollection<GigViewModel>(Gigs.Distinct(comp)); 
return distinctGigs; 

EDIT2:

Метод GetHashCode() НЕ дозвонились! После внедрения нового класса. Но коллекция все еще содержит дубликаты. У меня есть список «Gigs», который содержит объект «Artiest» (или Artist). У этого исполнителя есть свойство Naam, которое является строкой (Name).

+0

Он вызывает GetHashCode? – Liath

+0

Нет, нет. –

+0

Вы _certain_ метод не вызывается, или вы просто видите «дубликаты» в своих _results_. Вы уверены, что это не различия в пробельной или символьной оболочке? –

ответ

6

Таким образом, у вас был объект, который сравнивается с самим собой, и реализует как IEquatable, так и IEqualityComparer. Это вообще не имеет смысла. IEquatable - это способ сказать, что объект может сравниться с чем-то другим.IEqualityComparer - это способ сказать, что он может сравнивать две разные вещи, которые вы передаете друг другу. Обычно вы хотите делать то или другое, а не то, и другое.

Если вы хотите реализовать IEquatable то объект не только должен иметь Equals метод соответствующей подписи, но для этого нужно переопределить GetHashCode иметь разумную реализацию данного определения равенства. Вы этого не сделали. Вы создали метод GetHashCode, который принимает объект как параметр, но это перегрузка, используемая для IEqualityComparer. Вы должны переопределить версию без параметров при использовании IEquatable (той, которая определена в Object).

Если вы хотите создать класс, который реализует IEqualityComparer вам нужно передать компаратор в Distinct метода. Поскольку вы определили объект как свой собственный сопоставитель, вам нужно передать в каком-то экземпляре этого объекта в качестве второго параметра. Конечно, это не имеет особого смысла в этом смысле; поэтому было бы лучше, если вы пройдете этот маршрут, чтобы вытащить два метода, которые идут с IEqualityComparer в новый тип, и создать экземпляр этого типа для метода Distinct. Если вы фактически передали объект с этими определениями в качестве компаратора, он будет работать нормально.

+0

Прежде всего: Спасибо, что ответ! Я попробовал это (см. Мое редактирование), но я все еще сталкиваюсь с той же проблемой. –

+0

@TimKranen Что такое 'Naam'? – Servy

+0

Пожалуйста, просмотрите мои изменения еще раз, ситуация была изменена. –

1

После MSDN-х advice, вы бы лучше от создания отдельного класса для сравнения равенства:

Мы рекомендуем вам извлечь из класса EqualityComparer вместо реализации интерфейса IEqualityComparer, потому что в EqualityComparer класса для равенства с использованием метода IEquatable.Equals вместо метода Object.Equals. Этот соответствует методам Contains, IndexOf, LastIndexOf и Remove класса Dictionary и других общих коллекций .

Таким образом, создать класс, GigViewModelComparer, который наследуется от EqualityComparer и положить Equals и GetHashCode методы там.

Затем передайте экземпляр нового класса-компаратора при вызове Gigs.Distinct(new GigViewModelComparer()), и он должен работать. Следуйте в примере в ссылке MSDN, приведенной выше.

Я никогда не видел, чтобы кто-то реализовал IEqualityComparer в том же классе, что и тип объектов, о которых идет речь в сборнике, это, вероятно, по крайней мере часть вашей проблемы.

+1

Это не помогло бы ему с его нынешней проблемой. – Servy

+0

Действительно @Servy этого не делал. Однако: Спасибо за ваш вклад. –

+0

@TimKranen, но мое предложение о создании класса сравнения привело вас к дальнейшему, и теперь вы все еще видите дубликаты записей? –

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