c# - 继承相等比较器

标签 c# .net linq

我有一个客户类。

public class Customer
{
    private string _id;
    private string _name;
    // some more properties follow 

我从 MyEqualityComparer(客户)继承了 EqualityComparer。
我打算在 LINQ 查询中使用它。
MyEqualityComparer 用于两个对象之间的部分检查。
如果 customer.id 和 customer.name 匹配,我会平等对待对象。

public class MyComparer : System.Collections.Generic.EqualityComparer<Customer>
{
    public override bool Equals(Customer x, Customer y)
    {
        if (x.Id == y.Id && x.Name == y.Name)
            return true;
        else
            return false;
    }

    public override int GetHashCode(Customer obj)
    {
        return string.Concat(obj.Id,obj.Name).GetHashCode();
    }

}

我提到了 generating hashcode .
我不太确定连接字符串并将其用作哈希码。
我正在尝试做的事情是否安全可靠?

最佳答案

参见 this question on hashcodes一种基于多个字段返回一个哈希码的非常简单的方法。

话虽如此,我不会从 EqualityComparer<T> 派生我自己 - 我只是实现 IEqualityComparer<T>直接地。我不确定什么值 EqualityComparer<T>真的在这里给你,除了还实现非通用 IEqualityComparer .

还有一些事情:

  • 你应该处理 Equals 中的无效
  • 您现在的 Equals 代码可以简化为:

    return x.Id == y.Id && x.Name == y.Name;
    

更完整的 Equals 实现可能是:

public override bool Equals(Customer x, Customer y)
{
    if (object.ReferenceEquals(x, y))
    {
        return true;
    }
    if (x == null || y == null)
    {
        return false;
    }
    return x.Id == y.Id && x.Name == y.Name;
}

关于c# - 继承相等比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/340507/

相关文章:

c# - 将配置文件的内容读入与之关联的 dll

c# - Linq 和异步 Lambda

c# - Linq GroupBy 将每个空值作为一个组

C# 如何从拉伸(stretch)位图/图片框获取像素

c# - 检查是否曾经创建过惰性单例

c# - 来自字符串类型名称的强类型对象 (C#)

LinQ 查询中 lambda 表达式中的 C# 多个变量

c# - 适用于 Windows 应用商店应用程序的 .NET : UrlEncode

c# - 如何检查太长的路径?

c# - Umbraco 通过别名查找内容