为包含集合的对象实现 GetHashCode()

2024-01-08

考虑以下对象:

class Route
{
   public int Origin { get; set; }
   public int Destination { get; set; }
}

路由实现相等运算符。

class Routing
{
   public List<Route> Paths { get; set; }
}

我使用下面的代码为 Routing 对象实现 GetHashCode 方法,它似乎有效,但我想知道这是否是正确的方法?我依赖平等检查,因为我不确定,所以我想我会问你们。我可以只对哈希码求和还是需要做更多的事情才能保证预期的效果?

public override int GetHashCode() =>
{
    return (Paths != null 
                ? (Paths.Select(p => p.GetHashCode())
                        .Sum()) 
                : 0);
}

我检查了几个GetHashCode()问题在这里以及MSDN和Eric Lippert关于这个主题的文章,但找不到我要找的东西。


我认为你的解决方案很好。 (很久以后的评论:LINQ 的Sum方法将作用于checked上下文,所以你可以很容易地得到OverflowException这意味着它毕竟不是那么好。)但更常见的是进行 XOR(不进位加法)。所以它可能是这样的

public override int GetHashCode()
{
  int hc = 0;
  if (Paths != null)
    foreach (var p in Paths)
      hc ^= p.GetHashCode();
  return hc;
}

附录(答案被接受后):

请记住,如果您曾经使用过这种类型Routing in a Dictionary<Routing, Whatever>, a HashSet<Routing>或者使用哈希表的另一种情况,那么您的实例将是lost如果有人改变(变异)Routing将其添加到集合后。

如果您确定这种情况永远不会发生,请使用我上面的代码。Dictionary<,>如果你确保没有人改变的话,依此类推仍然有效Routing所引用的。

另一种选择是只写

public override int GetHashCode()
{
  return 0;
}

如果您认为哈希码永远不会被使用。如果每个实例都返回0对于哈希码,使用哈希表会获得非常糟糕的性能,但您的对象不会丢失。第三种选择是抛出一个NotSupportedException.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为包含集合的对象实现 GetHashCode() 的相关文章

  • LINQ to XML - 如何正确使用 XDocument

    现在我首先要说的是 这确实是一项任务 然而 在我遇到 Linq to XML 语法之前 我几乎已经完成了它 我有 2 个课程 曲目和 CD 现在作为作业的一部分 我创建了一张 CD 然后向其中添加了一些曲目 在搜索了大量完美解释了如何从 x
  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 阅读 Stack Overflow RSS 源

    我正在尝试获取未回答问题的列表the feed https stackoverflow com feeds 但我在阅读时遇到困难 const string RECENT QUESTIONS https stackoverflow com f
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • 防止复制构造和返回值引用的分配

    如果我有一个函数返回对类实例的引用 但我无法控制其源 比如说list
  • 捕获当前正在播放的声音

    是否可以捕获计算机上当前播放的声音 如果能够将其保存为 mp3 就好了 但我认为这样做会存在一些法律问题 所以 wav 也可以 我环顾四周 有人建议使用虚拟音频线之类的东西 在 C 中捕获声音输出 https stackoverflow c
  • CMake - 将预构建库链接到 C# 项目

    我正在使用 CMake 构建 C 库 该库依赖于已构建的库 dll 我似乎无法让图书馆链接到我的图书馆 我尝试过使用target link libraries mylib external lib 我也尝试过暴力破解 reference e
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 在 C# 中赋值后如何保留有关对象的信息?

    我一直在问我的想法可能是解决方案 https stackoverflow com questions 35254467 is it possible in c sharp to get the attributes attached to
  • 标准 C 中的 sizeof 与 sizeof()? [复制]

    这个问题在这里已经有答案了 我看到一些直接使用 sizeof 的代码 想知道它是否是标准 C 令我惊讶的是 它运行得很好 这是一个例子 include
  • OpenMP C 程序运行速度比顺序代码慢

    我是 OpenMP 的新手 正在尝试并行化 Jarvis 的算法 然而事实证明 与顺序代码相比 并行程序花费的时间要长 2 3 倍 难道问题本身就不能并行化吗 或者我并行化它的方式有问题 这是我针对该问题的 openMP 程序 其中有 2
  • 用 C# 编写的带有点击移动的 WPF 游戏

    我试图将标签网格移动到鼠标的位置 就像冒险游戏中的移动一样 理想情况下 我会在途中删除并重新绘制它们 但是 现在我只想弄清楚如何将 int 转换为厚度或 pointtoscreen 到目前为止我有 player XMove int Mous
  • 删除对象时指针自动指向空

    假设我有一个对象和其他几个不同类类型的对象中的 10 个指向它的指针 如果对象被删除 这些指针必须设置为空 通常我会将对象的类与具有指向它的指针的类互连 以便它可以通知它们它正在被删除 并且它们可以将它们的指针设置为空 但这也有一个负担 即
  • 宏观评价[重复]

    这个问题在这里已经有答案了 可能的重复 未定义的行为和序列点 https stackoverflow com questions 4176328 undefined behavior and sequence points 我无法理解以下宏
  • 如何使用 g++ 在 c++ 20 中使用模块?

    我读了这个链接https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules并尝试从该网站复制以下示例 我已经知道这个编译器部分支持模块系统 注 我用的是windo
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • 当我读取 500MB FileStream 时出现 OutOfMemoryException

    我使用 Filestream 读取大文件 gt 500 MB 但出现 OutOfMemoryException 任何有关它的解决方案 我的代码是 using var fs3 new FileStream filePath2 FileMode

随机推荐

  • Swift 的 hash 和 hashValue 之间的区别

    The HashableSwift 中的协议要求您实现一个名为的属性hashValue protocol Hashable Equatable Returns the hash value The hash value is not gua
  • C语言的回文程序

    我的 C 程序是回文 其功能有错误 我的函数不是比较字符串中的 2 个字符 当我输入单个字符时 它会回答回文 但如果是两个或更多字符 则始终不是回文 Code int IntStrlength strlen StrWord int IntC
  • SQL Server TRY...CATCH 与 XACT_STATE

    我对 MSDN 文档有疑问TRY CATCH块 查看这篇文章并向下滚动到示例 C 使用 TRY CATCH 和 XACT STATE http msdn microsoft com en us library ms175976 aspx h
  • 熊猫:删除连续的重复项

    在 pandas 中仅删除连续重复项的最有效方法是什么 drop duplicates 给出 In 3 a pandas Series 1 2 2 3 2 index 1 2 3 4 5 In 4 a drop duplicates Out
  • IE8 中的 CSS 最大宽度

    对于我的输入 可以有classname half or half not placeholder value Firebug 显示两个输入都有一个固定的宽度25em input half input half not placeholder
  • 将 CSS“#”(ID)替换为 .(类)

    我有一个像这样的CSS字符串 xyz color ee2ee2 abc background color FFFFFF border color 1px solid eee def xyz border color 1px solid dd
  • 解决灾难性回溯的工具[重复]

    这个问题在这里已经有答案了 我一般要求提供一种工具或方法来查找正则表达式中导致不受控制的回溯的 热点 我对所有格匹配 否定前瞻断言 原子组等有相当好的掌握 但我面临着一种情况 不清楚我的正则表达式到底错在哪里 有问题的正则表达式是 PCRE
  • 文件搜索索引的算法问题

    有一个问题 我也有解决方案 但我无法理解解决方案 请提供一些示例并提供一些经验 Question 给定一个包含大约 3 亿个社会安全号码 9 位数字 的文件 查找文件中没有的 9 位数字 您拥有无限的驱动器空间 但只有 2MB 的 RAM
  • 如何将 Google One Tap 登录与 django-allauth 集成?

    如何将 Google One Tap 登录体验与 django allauth 集成 django allauth 是集成的 非常适合简单的用户名 密码登录 我拥有 Google OneTap 更好的用户体验 可以识别用户经过身份验证的 G
  • 从 Leaps regsubsets 获取所有模型

    我使用 regsubsets 来搜索模型 是否可以自动创建所有lm从参数选择列表中 library leaps leaps lt regsubsets y x1 x2 x3 data nbest 1 method exhaustive su
  • 如何将 json 编码的 PHP 数组转换为 Javascript 中的数组? [复制]

    这个问题在这里已经有答案了 我正在使用 AJAX 从 PHP 文件中获取 JSON 编码的数组 但在 JavaScript 中我需要将其用作数组 如何在 Javascript 中创建数组 我对 PHP 文件的 AJAX 调用 ajax ty
  • 如何在 Spinner 中选择项目并将其用作字符串?

    只是想看看我是否可以找出如何在微调器中选择项目并将其存储在字符串中 我已经看到了有关此问题的其他帖子 人们说将此行放入代码中 在我在下面发布的代码的最后一行下面 String Genders Gender getSelectedItem t
  • 将代码分配给动态创建的按钮

    我正在尝试获取一个在 Excel 用户表单上动态创建的按钮来运行名为的宏transfer我写过的Module 1我的项目的 模块 部分 下面我将迄今为止编写的代码粘贴到用户窗体中 该窗体实际上设法创建了Transfer to Sheet框架
  • “创建用户”怎么写?使用 MySQL 准备好的语句

    I tried SET user foo localhost SET pass bar SET sql CREATE USER IDENTIFIED BY PREPARE stmt FROM sql 我得到错误 ERROR 1064 420
  • FastAI lrfind()方法无法正常工作

    Update 1 我根据 无论坡度如何 你都希望从该点返回 10 倍 更新了我的 lr 并将其设置为 max lr 切片 1e 3 1e 2 这就是我得到的 和情节 这是什么意思 正如您在第二张图中看到的那样 从 1e 08 开始损失就非常
  • 为什么 JUnit 中不推荐使用assertEquals(double,double)?

    我想知道为什么assertEquals double double 已弃用 I used import static org junit Assert assertEquals 我使用的是 JUnit 4 11 下面是我的代码 import
  • 返回指向本地结构的指针

    我看到一些具有如下结构的代码示例 type point struct x y int func newPoint point return point 10 20 我有 C 背景 这对我来说似乎是错误 这种构造的语义是什么 新的点是分配在栈
  • 在行内插入表格

    我编写了一个包含两个表的脚本 tbl1是一个主表 tbl2是我想插入到的第二个表tbl1第二行使用纯JavaScript 它工作完美 但是我的tbl2有一些html attribute 插入后看到代码时没有看到 note tbl1 and
  • 如何用 PHP 解析 phpDoc 风格的注释块?

    请考虑以下代码 我尝试仅解析文件中的第一个 phpDoc 样式注释 不使用任何其他库 出于测试目的 将文件内容放入 data 变量中 data file A lot of info about this file Could even co
  • 为包含集合的对象实现 GetHashCode()

    考虑以下对象 class Route public int Origin get set public int Destination get set 路由实现相等运算符 class Routing public List