gpt4 book ai didi

c# - Distinct() 不调用 equals 方法

转载 作者:太空狗 更新时间:2023-10-29 17:50:43 24 4
gpt4 key购买 nike

我已经实现了 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 属性,它是一个字符串(名称)。

最佳答案

因此,您让被比较的对象同时实现了 IEquatableIEqualityComparer。这通常没有意义。 IEquatable 是一种表示对象可以将自身与其他对象进行比较的方式。 IEqualityComparer 是一种说法,它可以比较您提供的两种不同的东西。您通常想做其中之一,而不是两者。

如果你想实现IEquatable那么这个对象不仅需要有一个适当签名的Equals方法,还需要覆盖GetHashCode 对给定的相等定义有一个合理的实现。 你没有那样做。您创建了将对象作为参数的 GetHashCode 方法,但这是用于 IEqualityComparer 的重载。使用 IEquatable(在 Object 中定义的)时,您需要覆盖无参数版本。

如果您想创建一个实现 IEqualityComparer 的类,您需要将比较器传递给 Distinct 方法。由于您已将对象定义为它自己的比较器,因此您需要将此对象的某个实例作为第二个参数传递。当然,这种方式并没有多大意义;所以如果你走这条路,最好将 IEqualityComparer 的两个方法提取到一个新类型中,并为 Distinct 创建一个该类型的实例> 方法。如果您实际上将具有这些定义的对象作为比较器传递,它就可以正常工作。

关于c# - Distinct() 不调用 equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com