我已经实现了IEqualityComparer和IEquatable(两者都是确定的),但是当我在集合上调用Distinct()方法时,它不会调用它附带的方法 . 这是我在调用Distinct()时执行的代码 .
ObservableCollection<GigViewModel> distinctGigs = new ObservableCollection<GigViewModel>(Gigs.Distinct<GigViewModel>());
return distinctGigs;
我想返回一个ObservableCollection,它不包含'Gigs'IbservableCollection中的任何双重对象 .
我在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()
方法被调用!实施新课程后 . 但该集合仍包含重复项 . 我有一个包含'Artiest'(或艺术家)对象的'Gigs'列表 . 此Artist具有Naam属性,即String(Name) .
2 回答
所以你有自己被比较的对象实现
IEquatable
以及IEqualityComparer
. 这通常没有意义 .IEquatable
是一种说明对象可以将自己与其他东西进行比较的方式 .IEqualityComparer
是一种说法,它可以比较你给彼此的两个不同的东西 . 你通常想做一个或另一个,而不是两个 .如果要实现
IEquatable
,则该对象不仅需要具有相应签名的Equals
方法,而且还需要覆盖GetHashCode
以对给定的相等定义具有合理的实现 . You didn't do that . 您创建了GetHashCode
方法,该方法将对象作为参数,但这是IEqualityComparer
使用的重载 . 使用IEquatable
(Object
中定义的版本)时,需要覆盖无参数版本 .如果要创建实现
IEqualityComparer
的类,则需要将比较器传递给Distinct
方法 . 因为've defined the object as its own comparer you'd需要传递此对象的某个实例作为第二个参数 . 当然,这并没有真正意义上的这种方式;所以如果你走这条路线,将IEqualityComparer
的两个方法拉出到一个新类型中会更好,并为Distinct
方法创建该类型的实例 . 如果您实际上将具有这些定义的对象作为比较器传递,它就可以正常工作 .在MSDN的advice之后,你最好为你的平等比较创建一个单独的类:
因此,创建一个类
GigViewModelComparer
,它派生自EqualityComparer
并将Equals
和GetHashCode
方法放在那里 .然后,在对
Gigs.Distinct(new GigViewModelComparer())
的调用中传递一个新的比较器类的实例,它应该可以工作 . 请按照上面提供的MSDN链接中的示例进行操作 .我从来没有见过有人在同一个类中实现
IEqualityComparer
与所讨论的集合包含的对象类型,这可能至少是你问题的一部分 .