使用枚举上的 XOR 运算符重载 GetHashCode 和相等运算符

2024-03-05

我有以下课程,它是统计分析包的一部分。

  • The MetricKey对象用作字典键。
  • Decision, MetricUnit & Portfolio都是枚举。

我必须重写相等运算符 (==) 才能使字典键匹配工作。我使用了以下指导http://msdn.microsoft.com/en-us/library/ms173147.aspx http://msdn.microsoft.com/en-us/library/ms173147.aspx。该指南说我应该重载我已经完成的 GetHashCode 方法,但我不明白将枚举转换为整数以进行 XOR (^) 操作的含义。我所做的是否有效,或者由于我的枚举整数值重叠,我会得到冲突的哈希码吗?:

public class MetricKey
{
    public MetricKey(Decision decision, MetricUnit metricUnit, Portfolio portfolio)
    {
        Decision = decision;
        Unit = metricUnit;
        Portfolio = portfolio;
    }

    public Decision Decision { get; private set; }
    public MetricUnit Unit { get; private set; }
    public Portfolio Portfolio { get; private set; }

    public static bool operator == (MetricKey a, MetricKey b)
    {
        if (ReferenceEquals(a, b))
            return true;
        if (((object) a == null) || ((object) b == null))
            return false;
        return a.Decision == b.Decision && a.Unit == b.Unit && a.Portfolio == b.Portfolio;
    }

    public static bool operator != (MetricKey a, MetricKey b)
    {
        return !(a == b);
    }

    public override bool Equals(System.Object obj)
    {
        if (obj == null)
            return false;
        var metricKey = obj as MetricKey;
        if ((System.Object) metricKey == null)
            return false;
        return Decision == metricKey.Decision && Unit == metricKey.Unit && Portfolio == metricKey.Portfolio;
    }

    public bool Equals(MetricKey metricKey)
    {
        if ((object) metricKey == null)
            return false;
        return Decision == metricKey.Decision && Unit == metricKey.Unit && Portfolio == metricKey.Portfolio;
    }

    public override int GetHashCode()
    {
        return (int)Decision ^ (int)Unit ^ (int)Portfolio;
    }
}

There is nothing wrong with the cast to int - however, I would actually avoid xor - it is easy to create collisions with likely values of the enums (1,2,3, etc). Note that collisions don't break anything, but they can make things more expensive. I might use something like (picking at random taking inspiration from the C# compiler's handling of anonymous types):

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

使用枚举上的 XOR 运算符重载 GetHashCode 和相等运算符 的相关文章

  • 我可以使用反射更改 C# 中的私有只读字段吗?

    我想知道 由于很多事情都可以使用反射完成 我可以在构造函数完成执行后更改私有只读字段吗 注 只是好奇 public class Foo private readonly int bar public Foo int num bar num
  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • Web UI 中的 .Result 出现死锁

    我正在阅读以下主题http blog stephencleary com 2012 07 dont block on async code html http blog stephencleary com 2012 07 dont bloc
  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • 如何调试参数化 SQL 查询

    我使用 C 连接到数据库 然后使用 Ad hoc SQL 来获取数据 这个简单的 SQL 查询非常方便调试 因为我可以记录 SQL 查询字符串 如果我使用参数化 SQL 查询命令 有没有办法记录 sql 查询字符串以进行调试 我想就是这样的
  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • 身份未映射异常

    System Security Principal IdentityNotMappedException 无法转换部分或全部身份引用 该错误仅在应用程序注册后出现一次 当 SecurityIdentifier 无法映射时 例如 返回 Ide
  • 使用 VSTO 更改 Outlook 设置

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

    如果我有一个函数返回对类实例的引用 但我无法控制其源 比如说list
  • 通过 mpi 发送 c++ std::vector

    我知道存储一个std vector
  • CMake - 将预构建库链接到 C# 项目

    我正在使用 CMake 构建 C 库 该库依赖于已构建的库 dll 我似乎无法让图书馆链接到我的图书馆 我尝试过使用target link libraries mylib external lib 我也尝试过暴力破解 reference e
  • C#:使用 System.Text 和 System.Text.RegularExpressions 之间的区别

    在 ASP NET C 应用程序中 我注意到为了使用 Regex 和 StringBuilder 我必须将两者都放在 using System Text using System Text RegularExpressions 从简单的角度
  • 抽象类和接口之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 接口与基类 https stackoverflow com questions 56867 interface vs base class 我不明白抽象类和接口之间的区别 我什么时候需要使用哪种字体
  • 标准 C 中的 sizeof 与 sizeof()? [复制]

    这个问题在这里已经有答案了 我看到一些直接使用 sizeof 的代码 想知道它是否是标准 C 令我惊讶的是 它运行得很好 这是一个例子 include
  • SSBO 是更大的 UBO?

    我目前正在 OpenGL 4 3 中使用 UBO 进行渲染 以将所有常量数据存储在 GPU 上 诸如材料描述 矩阵等内容 它可以工作 但是 UBO 的小尺寸 我的实现为 64kB 迫使我多次切换缓冲区 减慢渲染速度 我正在寻找类似的方法来存
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 宏观评价[重复]

    这个问题在这里已经有答案了 可能的重复 未定义的行为和序列点 https stackoverflow com questions 4176328 undefined behavior and sequence points 我无法理解以下宏

随机推荐

  • Chrome 和可能 Opera 自动对对象属性进行排序

    问题是 Chrome 会自动对对象的属性进行排序 如果我有一个像这样的对象 var obj 4 first 2 second 1 third 然后当我下一步时 for var i in obj console debug obj i 我看到
  • 在网页中嵌入 IRC 客户端的最佳方式

    我正在寻找一个好的 免费的 最好是开源的 IRC 客户端来嵌入网页中 支持大多数浏览器的明显要求是 如果需要插件 则该插件应该是已经广泛部署的插件 并且不应该给提供页面服务的网络服务器带来太大压力 不是一个真正的编程问题 但是Mibbit
  • JQuery - 从数据动态生成图形树视图

    我想动态生成一个树视图来表示应用程序中的用户连接 但我不希望它看起来像普通的树视图 看起来像文件系统结构 如下所示 但更像是这样的流程图 所以基本上我想以比树视图更图形化的方式显示它 如果可能的话 能够放大和缩小 如何才能实现这一目标 你知
  • Blackberry - 具有不同 ID 的可点击 BitmapField

    我正在创建一个应用程序 在其中我通过 JSON 从 Web 服务器获取带有 id 的礼品图像 当我点击任何礼物图像时 它会进入下一页 其中显示该图像的所有信息 通过 JSON 从 Web 服务器获取图像信息及其 ID 问题是 当我点击页面上
  • 轴。即使api返回404错误,如何在try catch finally中获得错误响应

    for e g async gt let apiRes null try apiRes await axios get https silex edgeprop my api v1 a catch err console error err
  • R 上的实时图表 - Shiny

    我正在尝试制作一个交互式图表 在一个闪亮的应用程序上绘制金融股票数据 我的尝试是不断更新数据 从而更新图表 我使用一个名为 Highcharter 的包来管理这个 下面显示了服务器部分的部分代码 getDataIntraday 接收两个输入
  • 向路由器或视图集添加更多视图 (Django-Rest-Framework)

    本质上 我试图找到一种在不创建自定义路由器的情况下将更多视图附加到路由器的好方法 有什么好的方法可以实现这个目标呢 这与我想要实现的目标相当 为了这个问题 变量名已经改变 我想介绍的示例方法也被极其简化 Router router rout
  • Python 3、网页抓取和 Javascript [天哪]

    我已经到了使用 Javascript 和 Python3 进入网页抓取混战的阶段 我很清楚我的靴子可能会碰到一匹死马 但我还是想拔出我的六发枪 这是一部意大利式西部片 是我的灰帽子吗 背景故事 我正在使用Python 3 2 3 我有兴趣收
  • 使用谷歌分析数据将嵌套行转置为bigquery中的列

    我感兴趣的是使用自定义维度属性来吸引访问者 其中每一行都是一个唯一的 fullvisitorid 列是所需的自定义维度值 以伦敦头盔为例 在这里我用我感兴趣的两个自定义尺寸来吸引访客 SELECT fullvisitorid customD
  • AWS lambda 与 python asyncio。事件循环闭合问题?

    关闭 aws lambda 中的事件循环会影响未来的 lambda 运行吗 我有一些 aysncio python 代码在 aws lambda 服务中运行 代码逻辑如下 def lambda handler event context l
  • 在 Javascript 中创建多维数组和矩阵

    尝试创建一个函数mCreate 给定一组数字返回一个多维数组 矩阵 mCreate 2 2 2 0 0 0 0 0 0 0 0 当此函数仅处理 2 个深度级别时 即 mCreate 2 2 0 0 0 0 我知道要做 2 个级别 你可以使用
  • 如何使用 Intl 获取 Flutter 中当前语言环境的文本方向

    我正在创建一个新的 flutter UI 组件 其中包含选择并获取有关产品的更多信息 我希望这个组件也支持 RTL 所以我需要获取当前的语言环境方向 这将使我知道选择形状的哪些角将被圆化 The LTR形状代码是这样的 shape Roun
  • Visual studio(MAC)控制台应用程序[重复]

    这个问题在这里已经有答案了 也许你们中的一些人知道 Visual Studio 预览版 已经可以使用了 我有一个简单的问题 也许我做错了什么 或者它不能正常工作 当我开始调试控制台应用程序时 不想让我从键盘读取名称 string name
  • 在 PhpStorm 中设置终端字体大小?

    如何在 JetBrains PhpStorm IDE 的嵌入式终端中设置字体大小 文字太小 这可能吗 LazyOne 已经指出了您可以在哪里更改此设置 https stackoverflow com a 31436405 247893 请记
  • C# Winforms:以编程方式显示按钮悬停状态

    我在 winform 上显示数字键盘来输入代码 我正在显示带有按钮的数字键盘 用户将仅使用键盘数字键盘来输入代码 密码 但当然你可以使用鼠标 如果我们使用鼠标单击按钮 我们会得到蓝色效果来显示悬停和按下状态 我在想我是否可以以某种方式以编程
  • NSDateComponentsFormatter 的 stringFromDate(_, toDate:) 返回 nil

    Question Why is string nil let formatter NSDateComponentsFormatter let referenceDate NSDate timeIntervalSinceReferenceDa
  • 复制文件列表 (txt)

    我见过一些脚本示例 但似乎没有一个提供如何从 t xt 列表中读取文件名的示例 这个例子不错 这样就可以将A文件夹中的所有文件复制到B文件夹中 xcopy c olddir java c newdir D E Q Y 但我需要类似下一个的东
  • Backbone.js 在回退中哈希后斜线 - 历史推送状态

    我在用着Backbone js 的路由 http documentcloud github com backbone Router 它为浏览器生成如下网址 http my app com help 对于 Internet Explorer
  • Kotlin-Kapt 注解处理器无法与 Maven 一起使用

    我想从 kotlin 实体类生成 jpa querydsl 文件 网上有一个非常好的示例 介绍如何使用 gradle 生成 dsl 文件https github com JetBrains kotlin examples blob mast
  • 使用枚举上的 XOR 运算符重载 GetHashCode 和相等运算符

    我有以下课程 它是统计分析包的一部分 The MetricKey对象用作字典键 Decision MetricUnit Portfolio都是枚举 我必须重写相等运算符 才能使字典键匹配工作 我使用了以下指导http msdn micros