繁体   English   中英

使用.GetHashCode()的对象相等性列表

[英]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
  1. 比较哈希码时,为什么对象列表不相等

  2. 序列化为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM