继承相等比较器 [英] Inheriting the equality comparer

查看:52
本文介绍了继承相等比较器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Customer类.

I have a Customer class.

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

我正在继承EqualityComparer表单MyEqualityComparer(客户).
我打算在LINQ查询中使用它.
MyEqualityComparer用于在两个对象之间进行部分检查.
如果customer.id和customer.name匹配,则将对象视为相等.

I am inheriting the EqualityComparer form MyEqualityComparer(of Customer).
This I am intending to use in LINQ queries.
MyEqualityComparer is intended for partial check between two objects.
If the customer.id and customer.name matches I treat the objects the equal.

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

}

我提到了生成哈希码.
我对串联字符串并将其用作哈希码不太确定.
这是我要尝试的安全可靠的方法吗?

I referred to generating hashcode.
I am little unsure about concatenating strings and using that as a hashcode.
Is this safe and sound what I am trying to do ?

推荐答案

请参见有关哈希码的问题,以一种非常简单的方法返回一个基于多个字段的哈希码.

See this question on hashcodes for a pretty simple way to return one hashcode based on multiple fields.

话虽如此,我自己不会从EqualityComparer<T>派生-我只会直接实现IEqualityComparer<T>.除了也实现非泛型的IEqualityComparer之外,我不确定EqualityComparer<T>的真正含义是什么.

Having said that, I wouldn't derive from EqualityComparer<T> myself - I'd just implement IEqualityComparer<T> directly. I'm not sure what value EqualityComparer<T> is really giving you here, other than also implementing the non-generic IEqualityComparer.

还有两件事:

  • 您应该在等于中处理空值
  • 您当前的Equals代码可以简化为:

  • You should handle nullity in Equals
  • Your present Equals code can be simplified to:

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

更完整的Equals实现可能是:

A fuller implementation of Equals might be:

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

这篇关于继承相等比较器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆