小编Fel*_*eir的帖子

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

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

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

c# linq distinct iequalitycomparer

11
推荐指数
1
解决办法
6129
查看次数

LINQ - 区别被忽略了吗?

所以我的LINQ代码有问题,我必须选择一个不同的数据集,我实现了以下内容IEqualityComparer:

public class ProjectRoleComparer : IEqualityComparer<ProjectUserRoleMap>
{
    public bool Equals(ProjectUserRoleMap x, ProjectUserRoleMap y)
    {
        return x.RoleID.Equals(y.RoleID);
    }
    public int GetHashCode(ProjectUserRoleMap obj)
    {
        return obj.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个上下文中,我希望检索一组ProjectUserRoleMap与给定项目相关的对象,由它的ID标识,我只想要一个ProjectUserRoleMap唯一的RoleID,但是我的严格指令对它执行不同的选择RoleID被忽略.我完全不知道为什么会这样,并且不了解LINQ足以想到一个解决方法.这是调用代码:

ProjectRoleComparer prCom = new ProjectRoleComparer();

IEnumerable<ProjectUserRoleMap> roleList = ProjectData.AllProjectUserRoleMap.Where(x => x.ProjectID == id).Distinct(prCom);
Run Code Online (Sandbox Code Playgroud)

这个代码给了我6个条目,当我知道我想要的条目数是4 时.我对LINQ的使用做错了吗?

作为参考,该ProjectUserRoleMap对象具有RoleID,(int)

.net c# linq distinct gethashcode

2
推荐指数
1
解决办法
259
查看次数

标签 统计

c# ×2

distinct ×2

linq ×2

.net ×1

gethashcode ×1

iequalitycomparer ×1