首页 > 解决方案 > 使用 .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 字符串并比较哈希码时对象列表相等?

标签: c#objectjson.nethashcode

解决方案


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);
  }
}

推荐阅读