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

标签 c# linq distinct iequalitycomparer

我有一个案例,我需要在 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/

相关文章:

c# - 低效的 Linq 语句

mysql - 查询以获取表中 2 个 ID 之间的唯一(最后一个时间线)连接

sql - 如何重写在行中给出特定值数量的查询以避免某些值并进一步计算其他值?

sql-server - 将数据导入 SQL Server 时跳过重复项

c# - GroupBy 从 IEnumerable 对象列表中删除重复项

c# - 如何在 .NET 中测试并发场景?

c# - 需要 Func 提供给 IEnumerable 和 IQueryable 的 Where() 方法

c# - 最小起订量 未执行调用

c# - 如何使用 Global.asax 文件重定向用户?

c# - 难以理解特定的 lambda 表达式