C# - 用于覆盖"等于"的任何代码优化技术?

use*_*677 4 c#

通常(根据我的理解)我必须遵循很多步骤

覆盖"等于"以检查对象的状态.

示例:

    public override bool Equals(object obj)
     {
       if (obj is SalesPerson && obj != null)
       {

         SalesPerson temp;

         temp = (SalesPerson)obj;

           if (temp.fName == this.fName && temp.lName == this.fName 
              && temp.personAge == this.personAge )
              {

                 return true;
              }

          else
          {
            return false;
          }

      }
       return false;
     }
Run Code Online (Sandbox Code Playgroud)

LINQ或其他技术的任何其他选择给我快捷代码?

更新:

此外,当我覆盖"等于"时,我也必须覆盖GetHasCode().

Jon*_*eet 11

到目前为止,所有答案对我来说似乎都很好.但是,您应该仔细考虑在继承层次结构中要求相等的含义.一个实例SalesPerson可以等于一个实例SalesManager(可以从中派生出来SalesPerson)吗?

麻烦的是,equals的对称性质阻碍了它.假设我们有:

SalesPerson x = new SalesPerson { ... };
SalesManager y = new SalesManager { ... };
Run Code Online (Sandbox Code Playgroud)

我希望y.Equals(x)是假的 - 这意味着它也x.Equals(y)应该是假的.

这意味着办理登机手续SalesPerson 确实需要:

public override bool Equals(object obj)
{
    SalesPerson salesPerson = obj as SalePerson;
    if (salesPerson == null) return false;
    return salesPerson.GetType() == this.GetType() &&
           salesPerson.fName == this.fName && 
           salesPerson.lName == this.fName && 
           salesPerson.personAge == this.personAge;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我没有比较,typeof(SalesPerson)因为实现SalesManager可能首先要调用此实现.

当然,如果SalesPerson密封,所有这些复杂性都会消失...在引入继承之前要非常小心的另一个原因:)

  • @jrista:x = y暗示y = x的属性称为对称性,而不是交换性. (2认同)

Cha*_*lie 7

这看起来更整洁:

public override bool Equals(object obj)
{
  SalesPerson salesPerson = obj as SalePerson;
  if(salesPerson == null) return false;
  return salesPerson.fName == this.fName && 
         salesPerson.lName == this.fName && 
         salesPerson.personAge == this.personAge;
}
Run Code Online (Sandbox Code Playgroud)


Ash*_*hby 6

当然,如果您真的想将它压缩成一行,您可以使用:

public override bool Equals(object obj)
{
  SalesPerson salesPerson = obj as SalePerson;

  return (salesPerson != null) &&
         (salesPerson.fName == this.fName && 
         salesPerson.lName == this.fName && 
         salesPerson.personAge == this.personAge);
}
Run Code Online (Sandbox Code Playgroud)

非null的测试保证首先运行,因此在其余的相等测试中不会发生潜在的NullReferenceException.