不同的特定比较者

时间:2013-12-09 12:27:19

标签: c# vb.net linq c#-4.0 distinct

我必须为Distinct实现特定的比较器:

public class MyModuleComparer : IEqualityComparer<GenDictionnaireMenu>
{


    public bool Equals(GenDictionnaireMenu x, GenDictionnaireMenu y)
    {
        //Check whether the compared objects reference the same data. 
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null. 
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        return x.LibelleModule == y.LibelleModule;
    }

    public int GetHashCode(GenDictionnaireMenu obj)
    {
        return obj == null ? 0 : (int)obj.CodeDictionnaireMenu;
    }
}

当我打电话给Distinct时我会用它:

Dim list = ListDictionnaire.Distinct(New MyModuleComparer()).ToList

问题是我在“list”中有相同的LibelleModule对象,如下所示:

  

object1 = code:1,LibelleModule:“Gestion administrative”,LIBELLE_SOUS_MODULE1:“Congé”

     

object2 = code:2,LibelleModule:“Gestion administrative”,LIBELLE_SOUS_MODULE1:“Congé”

     

object3 =代码:3,LibelleModule:“Gestion administrative”,LIBELLE_SOUS_MODULE1:“Gestioncarrière”

请提出任何建议!

1 个答案:

答案 0 :(得分:2)

您必须提供不同的GetHashCode实施。

Distinct()首先调用light GetHashCode函数,并且只有在发生冲突时才调用Equals,即如果GetHashCodeGenDictionnaireMenu的两个实例生成相同的结果1}}。

以下是GetHashCode定义:

  

两个相等的对象返回相等的哈希码。然而,   相反的情况并非如此:相等的哈希码并不意味着对象   平等。

这就是为什么永远不会调用EqualsCodeDictionnaireMenu对所有实例都不同的原因),这就是为什么你的两个实例被认为是相同的原因。

编辑:

实际上它有点复杂。有关所有详细信息,请参阅MSDN文档。

主要规则之一是:

  

如果两个对象比较相等,则每个对象的GetHashCode方法   对象必须返回相同的值。但是,如果两个对象没有   比较相同,两个对象的GetHashCode方法不相同   必须返回不同的值。

因此,如果您的项目在具有相同LibelleModule属性时比较相等,那么它们的哈希码应该相同。在您的情况下,即使LibelleModule相同,哈希码也总是不同。

因此,一个可能的哈希码可能是:

public int GetHashCode(GenDictionnaireMenu obj)
{
    return obj.LibelleModule != null ? obj.LibelleModule.GetHashCode() : 0;
}