c# - 使用 .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);
}
}
推荐阅读
- node.js - 用于 Google Cloud Functions 身份验证重定向的 gitHubAutoDeployer
- android - 当我在 JNI 中拼接字符串时“检测到堆损坏”
- lua - 您可以将实例保存在表中吗?
- c++ - 同一类函数的多个定义取决于同一继承类的多个类型?
- r - R中的代码仅对列的一部分求和(由行定义的组)
- ruby-on-rails - 如何将 gem 安装位置更改为正确的位置?
- python - 将文件列表转换为树状字典
- arrays - numpy 按列拆分数组并堆叠到每一行
- reactjs - 反应钩子设置触摸事件的开始位置
- javascript - 当视频被用户暂停时如何在视频上显示海报