[英]List of objects equality using .GetHashCode()
我想了解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字符串並比較哈希碼時,為什么對象列表相等 ?
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.