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

标签 c# silverlight windows-phone-8 windows-phone observablecollection

我已经实现了 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/

相关文章:

c# - 'awaited'任务在哪里执行?

silverlight - WP7音频流帮助

c# - Windows Phone 应用程序不发送 Cookie,但在 Windows 8 应用程序中使用相同的代码发送 Cookie

c# - 我如何处理 Windows Phone 中选定数据透视项的事件

c# - WPF 绑定(bind),其中值 = X

c# - 调整无边框窗体的大小,控件无处不在,没有空白区域

c# - 如何在linq to sql中分组?

c# - WP7 上的 JSON 序列化性能问题

c# - Windows Phone Silverlight 8.1 和 Windows Phone 8.1 开发的区别

c# - WinRT/WP8 等效于 System.Globalization.TextInfo.ToTitleCase