C# lic int GetHashCode(业务) { if(Object.ReferenceEquals(business,null)) 返回0; int-hashBusinessName=business.Name==null?0:business.Name.GetHashCode(); 返回hashProductName; } }

C# lic int GetHashCode(业务) { if(Object.ReferenceEquals(business,null)) 返回0; int-hashBusinessName=business.Name==null?0:business.Name.GetHashCode(); 返回hashProductName; } },c#,linq,C#,Linq,如果此相等是核心业务逻辑,并且不仅仅用于此特定比较,那么您甚至可以在业务本身上实现Equals和GetHashCode,以便在其他地方使用相等比较。请注意,这可能是对已假定引用相等的现有代码的重大更改。.Distinct()如果不提供手动比较器,将使用已处理类型的默认比较器,该比较器最终将使用.Equals()和.GetHashCode()您的业务课程 因此,除非您重写了这些方法,否则.Distinct()将只删除引用重复项。.Distinct()不提供手动比较器,将使用处理类型的默认比较器,该

如果此相等是核心业务逻辑,并且不仅仅用于此特定比较,那么您甚至可以在
业务
本身上实现
Equals
GetHashCode
,以便在其他地方使用相等比较。请注意,这可能是对已假定引用相等的现有代码的重大更改。

.Distinct()如果不提供手动比较器,将使用已处理类型的默认比较器,该比较器最终将使用
.Equals()
.GetHashCode()
您的
业务
课程

因此,除非您重写了这些方法,否则
.Distinct()
将只删除引用重复项。

.Distinct()
不提供手动比较器,将使用处理类型的默认比较器,该比较器最终将使用
.Equals()
.GetHashCode()
您的
业务
课程


因此,除非您重写了这些方法。
。Distinct()
将只删除引用重复项。

不确定为什么向下投票对我来说是一个合理的答案,“Distinct将比较类中的所有字段”仅适用于匿名类型和重写了
Equals
以比较所有字段的类型。我没有投反对票,但我想澄清这一点。+1代表原创性,但同意@DStanley的观点,最好编辑答案以避免误解。谢谢您的更正。我已经更新了我的答案。很高兴OP发现它很有用。@DanielKelley,我认为你用错误的方式纠正了它:)。字段对字段的比较作为默认行为仅适用于匿名类型,而不适用于自定义类,如业务。也许你甚至不明白为什么你的答案是有效的:)。我不确定为什么下一票对我来说是合理的答案“Distinct将比较类中的所有字段”仅适用于匿名类型和覆盖了
Equals
以比较所有字段的类型。我没有投反对票,但我想澄清这一点。+1代表原创性,但同意@DStanley的观点,最好编辑答案以避免误解。谢谢您的更正。我已经更新了我的答案。很高兴OP发现它很有用。@DanielKelley,我认为你用错误的方式纠正了它:)。字段对字段的比较作为默认行为仅适用于匿名类型,而不适用于自定义类,如业务。也许你甚至不明白你的答案为什么有效:)。哪个字段是“未分类”的?如果两条记录在该字段中具有相同的值,您选择哪个字段?哪个字段是“未分类”字段?如果两条记录在该字段中具有相同的值,您会选择哪个?这只是一种方法-您还可以实现一个
IEqualityComparer
,这可能是一个更好的选择,因为Overriding Equals将适用于所有场景,而不仅仅是此场景。实际上,这是Microsoft推荐的提供默认
IEqualityComparer
的方法。如果需要运行与默认值不同的
Distinct()
,则最好使用
IEqualityComparer
。这些都在链接下的注释中。:)是的,但问题中的要求可能不一定是该类型的“默认值”。这可能只是针对这种情况,在这种情况下,非默认的
IEqualityComparer
更合适。这只是一种方法——您还可以实现
IEqualityComparer
,这可能是一个更好的选择,因为Overriding Equals将适用于所有场景,而不仅仅是此场景。实际上,这是Microsoft推荐的提供默认
IEqualityComparer
的方法。如果需要运行与默认值不同的
Distinct()
,则最好使用
IEqualityComparer
。这些都在链接下的注释中。:)是的,但问题中的要求可能不一定是该类型的“默认值”。这可能只是针对这种情况,在这种情况下,非默认的
IEqualityComparer
更合适。
var results = db.Users.OfType<Business>()
              .Where(b => b.StateID == state && (term == null || b.Description.ToLower().Contains(term.ToLower())))
              .Distinct().Select(x => new { id = x.StateID, value = x.Description }).Take(5).ToList();
var results = db.Users.OfType<Business>()
          .Where(b => b.StateID == state && (term == null ||  b.Description.ToLower().Contains(term.ToLower())))
          .Select(x => new { id = x.StateID, value = x.Description })
          .Distinct()
          .Take(5)
          .ToList();
class BusinessEqualityComparer : IEqualityComparer<Business>
{

    public bool Equals(Business b1, Business b2)
    {
        if (b1.ID == b2.ID)
        {
            return true;
        }
        else
        {
            return false;
        }
    }


    public int GetHashCode(Business business)
    {
        int hCode = business.ID ^ business.ID ^ business.ID;
        return hCode.GetHashCode();
    }
class BusinessComparer : IEqualityComparer<Business>
{
    public bool Equals(Business x, Business y)
    {
        if (Object.ReferenceEquals(x, y))
            return true;
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;
        return x.Name == y.Name;
    }

    public int GetHashCode(Business business)
    {
        if (Object.ReferenceEquals(business, null))
            return 0;
        int hashBusinessName = business.Name == null ? 0 : business.Name.GetHashCode();
        return hashProductName;
    }
}