在C#中具有两个属性的对象上实现IEqualityComparer <T>

Fel*_*eir 11 c# linq distinct iequalitycomparer

我有一个案例,我需要抓取一堆不同的项目,但我的源是一个具有两个属性的对象的集合,如下所示:

public class SkillRequirement
{
    public string Skill { get; set; }
    public string Requirement { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我尝试获得如下集合:

SkillRequirementComparer sCom = new SkillRequirementComparer();

var distinct_list = source.Distinct(sCom);
Run Code Online (Sandbox Code Playgroud)

我试图为此实现一个IEqualityComparer<T>,但我对这个GetHashCode()方法感到难过.

Comparer的类:

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)
    {
        //?????
    }
}
Run Code Online (Sandbox Code Playgroud)

通常我会GetHashCode()在一个属性上使用,但因为我在两个属性上进行比较,所以我有点不知所措.我做错了什么,或者遗漏了一些非常明显的东西?

Tim*_*ter 10

您可以GetHashCode通过以下方式实施:

public int GetHashCode(SkillRequirement obj)
{
    unchecked
    {
        int hash = 17;
        hash = hash * 23 + obj.Skill.GetHashCode();
        hash = hash * 23 + obj.Requirement.GetHashCode();
        return hash;
    }
}
Run Code Online (Sandbox Code Playgroud)

最初来自J.Skeet

如果属性可以,null你应该避免NullReferenceException,例如:

int hash = 17;
hash = hash * 23 + (obj.Skill ?? "").GetHashCode();
hash = hash * 23 + (obj.Requirement ?? "").GetHashCode();
return hash;
Run Code Online (Sandbox Code Playgroud)