我有一个案例,我需要在 distinct 上抓取一堆项目,但我的源是具有两个属性的对象集合,如下所示:
public class SkillRequirement
{
public string Skill { get; set; }
public string Requirement { get; set; }
}
我尝试按如下方式获取集合:
SkillRequirementComparer sCom = new SkillRequirementComparer();
var distinct_list = source.Distinct(sCom);
我试图实现一个 IEqualityComparer<T>
为此,但我在 GetHashCode()
上难住了方法。
比较器类:
public class SkillRequirementComparer : IEqualityComparer<SkillRequirement>
{
public bool Equals(SkillRequirement x, SkillRequirement y)
{
if (x.Skill.Equals(y.Skill) && x.Requirement.Equals(y.Requirement))
{
return true;
}
else
{
return false;
}
}
public int GetHashCode(SkillRequirement obj)
{
//?????
}
}
通常我会使用 GetHashCode()
在一个属性上,但因为我正在比较两个属性,所以我有点不知所措。我做错了什么,还是遗漏了一些非常明显的东西?
最佳答案
您可以通过以下方式实现GetHashCode
:
public int GetHashCode(SkillRequirement obj)
{
unchecked
{
int hash = 17;
hash = hash * 23 + obj.Skill.GetHashCode();
hash = hash * 23 + obj.Requirement.GetHashCode();
return hash;
}
}
<子> originally来自 J.Skeet
如果属性可以是null
,您应该避免NullReferenceException
,例如:
int hash = 17;
hash = hash * 23 + (obj.Skill ?? "").GetHashCode();
hash = hash * 23 + (obj.Requirement ?? "").GetHashCode();
return hash;
关于c# - 在 C# 中对具有两个属性的对象实现 IEqualityComparer<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16667699/