我必须为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”
请提出任何建议!
答案 0 :(得分:2)
您必须提供不同的GetHashCode
实施。
Distinct()
首先调用light GetHashCode
函数,并且只有在发生冲突时才调用Equals
,即如果GetHashCode
为GenDictionnaireMenu
的两个实例生成相同的结果1}}。
以下是GetHashCode
定义:
两个相等的对象返回相等的哈希码。然而, 相反的情况并非如此:相等的哈希码并不意味着对象 平等。
这就是为什么永远不会调用Equals
(CodeDictionnaireMenu
对所有实例都不同的原因),这就是为什么你的两个实例被认为是相同的原因。
编辑:
实际上它有点复杂。有关所有详细信息,请参阅MSDN文档。
主要规则之一是:
如果两个对象比较相等,则每个对象的GetHashCode方法 对象必须返回相同的值。但是,如果两个对象没有 比较相同,两个对象的GetHashCode方法不相同 必须返回不同的值。
因此,如果您的项目在具有相同LibelleModule
属性时比较相等,那么它们的哈希码应该相同。在您的情况下,即使LibelleModule
相同,哈希码也总是不同。
因此,一个可能的哈希码可能是:
public int GetHashCode(GenDictionnaireMenu obj)
{
return obj.LibelleModule != null ? obj.LibelleModule.GetHashCode() : 0;
}