列表不应该等于它应该

时间:2015-12-17 18:01:21

标签: c#

我有一个名为User的对象。这是我的班级:

public class User
{
  public string Name { get; set; }
  public string IdNumber { get; set; }
  public string OrgName { get; set; }
  public string AcctCode { get; set; }
}

我创建两个完全相同的对象。

我想知道他们是否等于,但是,我得到了False

User user1 = new User()
{
  Name = "Test User",
  IdNumber = "1000354",
  OrgName = "North",
  AcctCode = "FTW"
};

User user2 = new User()
{
  Name = "Test User",
  IdNumber = "1000354",
  OrgName = "North",
  AcctCode = "FTW"
};

var doesEqual = user1.Equals(user2);
Console.WriteLine(doesEqual); // Returns FALSE

我还有两个列表,其中包含相同的对象,除了一个。

当我执行Except时,它不想正常工作并返回131。

List<User> ListOne; // Contains 131 User objects
List<User> ListTwo; // Contains 130 User objects
var difference = ListOne.Except(ListTwo);
Console.WriteLine(difference); // Returns 131

我做错了什么?

4 个答案:

答案 0 :(得分:2)

默认情况下,reference types会比较引用。这意味着你的2个独立实例,即使它们的字段具有相同的值,也是不同的对象,并且将比较为不等。您可以通过让您的类实现IEquatable<T>来“教”它如何比较您想要的任何方式来更改此行为。

一个很好的例子,几乎与您的用法相符,可以在MSDN找到。

答案 1 :(得分:1)

类默认相等标准是引用。它应该返回false。

你可以覆盖Equals方法(然后你必须实现GetHashCode)到你想要的任何逻辑。

public override bool Equals(object obj)
{    

    if(!(obj is User)) 
    {
        return false;
    }

     User user= obj as User;
    return user.Name == Name && user.IdNumber == IdNumber && user.OrgName == OrgName && user.AcctCode == AcctCode;
}

public override int GetHashCode()
{
    return IdNumber.GetHashCode();
}

答案 2 :(得分:0)

尽管对象的所有属性都具有相同的值,但它们是两个完全不同的对象。此user1包含对具有某些值的对象的堆的引用。同样适用于user2。这就是说这是对堆的两个不同的引用。

如果您不覆盖Equals方法,则相等性基于引用。所以对象是不同的,即使它们的所有属性具有完全相同的值。

答案 3 :(得分:0)

它们不相等,因为User(即&#34;引用类型&#34;)。对于参考类型,.Equals比较引用相等,两个实例user1user2是两个单独的引用。