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;
}
}