【发布时间】:2019-11-03 02:36:40
【问题描述】:
我想了解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 字符串并比较哈希码时,对象列表相等?
【问题讨论】:
-
您看到的是
Object.GetHashCode()和String.GetHashCode()之间的差异。 -
虽然列表是相同类型并且包含相同顺序的相同对象,但根据它们的哈希码,它们不被认为是相等的。另请参阅ideone.com/kE2gSj。
-
@JeroenMostert 啊,好吧!但是是什么让
object散列不同? -
object.GetHashCode()生成对象引用的哈希。 2 个实例 = 2 个不同的引用。 -
太好了。谢谢@Oliver
标签: c# object json.net hashcode