我有一个名为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
我做错了什么?
答案 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
比较引用相等,两个实例user1
和user2
是两个单独的引用。