我想了解GetHashCode
方法如何在相等的对象列表上工作。给出以下示例:
var user1 = new User { Id = Guid.NewGuid().ToString(), Name = "Chris" };
var user2 = new User { Id = Guid.NewGuid().ToString(), Name = "Jeff" };
var userList1 = new List<User> { user1, user2 }.OrderBy(o => o.Id);
var userList2 = new List<User> { user1, user2 }.OrderBy(o => o.Id);
var usersList1Hash = userList1.GetHashCode();
var usersList2Hash = userList2.GetHashCode();
var userListsEqual = usersList1Hash == usersList2Hash; // false
var userList1Json = JsonConvert.SerializeObject(userList1);
var userList2Json = JsonConvert.SerializeObject(userList2);
var usersList1JsonHash = userList1Json.GetHashCode();
var usersList2JsonHash = userList2Json.GetHashCode();
var userListsJsonEqual = usersList1JsonHash == usersList2JsonHash; // true
为什么在比较哈希码时对象列表不相等?
为什么序列化为JSON字符串并比较哈希码时对象列表相等?
答案 0 :(得分:0)
GetHashCode
函数给出对象的带符号的int32哈希值。
来自MSDN。
两个相等的对象返回相等的哈希码。然而, 反之则不成立:相等的哈希码并不意味着对象 相等,因为不同的(不相等)对象可以具有相同的哈希 代码。
GetHashCode
是一个虚函数,可以被覆盖。调用JsonConvert.SerializeObject
后得到的结果是字符串。 string
类基于字符串内容有自己的GetHashCode
实现。像下面这样。这就是为什么它匹配。
public class string {
char[] str = null;
...
public string(char[] input) {
this.str = input;
}
public override GetHashCode() {
//Logic to convert str to int 32 based on string contents;
return Convert.ToInt32(str);
}
}