比较两个对象

4
Employee emp1 = new Employee {Name = "Swapnil",Age = 27 };
            Employee emp2 = new Employee { Name = "Swapnil", Age = 27 };
            if (object.Equals(emp1, emp2))
            {

            }
            else
            {
            }

这段代码无法进行比较。 在C#中如何比较两个对象?


2
你尝试过什么?你知道你需要重写 EqualsGetHashCode 吗? - Jon Skeet
可以在此处找到有关GetHashCode()的更多信息:http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx - Maciej
@Maciej 如何使用哈希码进行比较?这真的可行吗?您提供的链接中有些评论说它不可靠。 - shajivk
你不能仅使用GetHashCode进行比较,但正如Jon所说,你需要重写GetHashCode和Equals两个方法以确保正确的功能。 - Maciej
不要忘记标记为已接受,如果它对您有效... - Pranay Rana
3个回答

2

如果没有覆盖Equals方法,那么只会发生引用比较。您想执行值比较。

请在Employee类中这样覆盖该方法:

public override bool Equals(Object emp)
{
    // If parameter is null return false.
    if (emp == null)
    {
        return false;
    }

     // If parameter cannot be cast to Point return false.
    Employee e = emp as Employee;
    if ((System.Object)e == null)
    {
        return false;
    }

    // Return true if the fields match
    return (Name == emp.Name) && (Age == emp.Age);
}

然后像这样比较对象:
if(emp1.Equals(emp2))
{ ... }

使用比较运算符的 OR:

if(emp1 == emp2)
{ ... }

更多细节请参见MSDN:http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx


Equals方法的参数类型为object,而不是Employee - Maarten

0

你需要在你的 Employee 类上重写 Equals 方法。示例(从 MSDN 偷来并修改):

   public override bool Equals(Object obj) 
   {
      // Check for null values and compare run-time types.
      if (obj == null || GetType() != obj.GetType()) 
         return false;

      Employee e = (Employee)obj;
      return (this.Name == e.Name) && (this.Age == e.Age);
   }

然后像这样使用它:

if (emp1.Equals(emp2))
{
    // ...

注意:如果你重写了Equals()方法,你也应该重写GetHashCode()方法。

如果指针不为空且不指向同一对象,则Object.Equals(e1, e2)最终会执行e1.Equals(e2)。 - Maarten
@Maarten 是的,我已经想到了,但是还是想先在反编译器中检查一下。 - Botz3000

0

请查看this链接,了解Object.Equals的描述。

如果您保留原样的类,则进行的比较是引用比较。这不是您想要的,您希望根据属性测试相等性。

如果您在Employee类中重写Equals(object)方法,则可以在那里实现自定义相等测试。如Botz3000已经给出的此处所示,了解如何覆盖此方法并实现自定义测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接