我已经实现了 IEqualityComparer 和 IEquatable(两者都只是为了确定),但是当我在集合上调用 Distinct() 方法时,它不会调用它附带的方法。这是我在调用 Distinct() 时执行的代码。
ObservableCollection<GigViewModel> distinctGigs = new ObservableCollection<GigViewModel>(Gigs.Distinct<GigViewModel>());
return distinctGigs;
我想返回一个 ObservableCollection,它不包含“Gigs”ObservableCollection 中的任何 double 对象。
我在 GigViewModel 类上实现了这样的接口(interface):
public class GigViewModel : INotifyPropertyChanged, IEqualityComparer<GigViewModel>, IEquatable<GigViewModel>
{
....
}
然后覆盖接口(interface)附带的方法,如下所示:
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 并将它的实例传递给 distinct 方法。但是这些方法仍然没有被触发。
平等比较器:
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;
编辑2:
GetHashCode()
方法确实被调用了!实现新类(class)后。但是该集合仍然包含重复项。我有一个包含“Artiest”(或艺术家)对象的“演出”列表。这位艺术家有一个 Naam 属性,它是一个字符串(名称)。
最佳答案
因此,您让被比较的对象同时实现了 IEquatable
和 IEqualityComparer
。这通常没有意义。 IEquatable
是一种表示对象可以将自身与其他对象进行比较的方式。 IEqualityComparer
是一种说法,它可以比较您提供的两种不同的东西。您通常想做其中之一,而不是两者。
如果你想实现IEquatable
那么这个对象不仅需要有一个适当签名的Equals
方法,还需要覆盖GetHashCode
对给定的相等定义有一个合理的实现。 你没有那样做。您创建了将对象作为参数的 GetHashCode
方法,但这是用于 IEqualityComparer
的重载。使用 IEquatable
(在 Object
中定义的)时,您需要覆盖无参数版本。
如果您想创建一个实现 IEqualityComparer
的类,您需要将比较器传递给 Distinct
方法。由于您已将对象定义为它自己的比较器,因此您需要将此对象的某个实例作为第二个参数传递。当然,这种方式并没有多大意义;所以如果你走这条路,最好将 IEqualityComparer
的两个方法提取到一个新类型中,并为 Distinct
创建一个该类型的实例> 方法。如果您实际上将具有这些定义的对象作为比较器传递,它就可以正常工作。
关于c# - Distinct() 不调用 equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974229/