首页 文章

Distinct()不调用equals方法

提问于
浏览
9

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

  • 7

    所以你有自己被比较的对象实现 IEquatable 以及 IEqualityComparer . 这通常没有意义 . IEquatable 是一种说明对象可以将自己与其他东西进行比较的方式 . IEqualityComparer 是一种说法,它可以比较你给彼此的两个不同的东西 . 你通常想做一个或另一个,而不是两个 .

    如果要实现 IEquatable ,则该对象不仅需要具有相应签名的 Equals 方法,而且还需要覆盖 GetHashCode 以对给定的相等定义具有合理的实现 . You didn't do that . 您创建了 GetHashCode 方法,该方法将对象作为参数,但这是 IEqualityComparer 使用的重载 . 使用 IEquatableObject 中定义的版本)时,需要覆盖无参数版本 .

    如果要创建实现 IEqualityComparer 的类,则需要将比较器传递给 Distinct 方法 . 因为've defined the object as its own comparer you'd需要传递此对象的某个实例作为第二个参数 . 当然,这并没有真正意义上的这种方式;所以如果你走这条路线,将 IEqualityComparer 的两个方法拉出到一个新类型中会更好,并为 Distinct 方法创建该类型的实例 . 如果您实际上将具有这些定义的对象作为比较器传递,它就可以正常工作 .

  • 1

    在MSDN的advice之后,你最好为你的平等比较创建一个单独的类:

    我们建议您从EqualityComparer类派生而不是实现IEqualityComparer接口,因为EqualityComparer类使用IEquatable.Equals方法而不是Object.Equals方法测试相等性 . 这与Dictionary类和其他泛型集合的Contains,IndexOf,LastIndexOf和Remove方法一致 .

    因此,创建一个类 GigViewModelComparer ,它派生自 EqualityComparer 并将 EqualsGetHashCode 方法放在那里 .

    然后,在对 Gigs.Distinct(new GigViewModelComparer()) 的调用中传递一个新的比较器类的实例,它应该可以工作 . 请按照上面提供的MSDN链接中的示例进行操作 .

    我从来没有见过有人在同一个类中实现 IEqualityComparer 与所讨论的集合包含的对象类型,这可能至少是你问题的一部分 .

相关问题