字典 C# 中的 GetHashCode 和 Equals 实现

2024-01-13

我来到这个网站搜索 Dictionary 中的对象比较,我发现重写 GetHashCode 和 Equals 是在 C# 中进行对象比较的必须条件。 这是我一直试图使用 FOREACH 迭代方法解决的一段代码。但由于性能问题,我的老板说要在不使用任何迭代的情况下执行相同的操作(可能通过使用 containskey 或 containsvalue 方法)。非常欢迎任何帮助..

  public class employee
    {
        public string empname { get; set; }
        public string location { get; set; }
        public double kinid { get; set; }
        public double managerKin { get; set; }
        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
    }

    public class manager
    {
        public string managername { get; set; }
        public double kinid { get; set; }

        public override int GetHashCode() 
        { 
          return 17 * managername.GetHashCode() + kinid.GetHashCode();
        }
    }
    public class program
    {
        public static void Main()
        {
            employee emp = new employee();
            employee emp2 = new employee();
            manager mng = new manager();
            manager mng2 = new manager();

            emp.empname = "Deepak";
            emp.location = "Pune";
            emp.kinid = 36885;
            emp.managerKin = 007;


            emp2.empname = "Astha";
            emp2.location = "Pune";
            emp2.kinid = 30000;
            emp2.managerKin = 007;

            mng.kinid = 007;
            mng.managername = "Gaurav";
            mng2.kinid = 001;
            mng2.managername = "Surya";

            Dictionary<employee, manager> relations = new Dictionary<employee, manager>();
            relations.Add(emp, mng);
            relations.Add(emp2, mng2);

            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("The Manager details are :");
            foreach (var element in relations)
            Console.WriteLine(" \n KINID : {0} \n  Manager'sName :                    {1}",element.Value.kinid, element.Value.managername);
            Console.WriteLine("Enter the details of the manager..");
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.Write("\nManager's Kin : ");
            double mkin = Convert.ToDouble(Console.ReadLine());

            Console.Write("Manager's Name : ");
            string mname = Console.ReadLine();

            manager mng1 = new manager();
            mng1.kinid = mkin;
            mng1.managername = mname;
            int hashvalue = 17 * mname.GetHashCode() + mkin.GetHashCode();



            #region BY USING FOREACH LOOP
            int i = 0;
            foreach (var element in relations)
            {
                if (element.Value.GetHashCode() == hashvalue)
                {
                    i += 1;
                    if (i == 1)
                    {
                        Console.WriteLine("The Following employees report to the Manager : {0}", mname);

                    }
                    Console.WriteLine(element.Key.empname + " " + element.Key.kinid + " " + element.Key.location + " " + element.Key.managerKin);

                }
            }
            if (i == 0)
            {
                Console.WriteLine("sorry the manager's details you entered \"{0}\" \"{1}\" does not exist in our database..", mng1.managername, mng1.kinid);

            }
            #endregion

            Console.ReadLine();
        }

    }

为了使用 ContainsKey 或 ContainsValue 关键字在字典中搜索对象,编译器使用两个隐式函数,即 GetHashCode() 和 Equals()。因此,当我们有一个要比较的对象时,我们需要重写这两个方法!

这是代码

#region USING DICTIONARY TO STORE CLASS OBJECTS (check employee existence and print manager's name)
public class employee
{
    public string empname { get; set; }
    public string location { get; set; }
    public double kinid { get; set; }
    public double managerKin { get; set; }

    //public override bool Equals(object obj) // ANY OF THE TWO EQUALS METHOD WORKS.
    //{
    //    employee otheremployee;
    //    otheremployee = (employee)obj;
    //    return (otheremployee.kinid == this.kinid && otheremployee.location == this.location && otheremployee.empname == this.empname && otheremployee.managerKin == this.managerKin);

    //}
    public override bool Equals(object obj)   //When Running this entire code, put a break-point on both the Equals() and GetHashCode() methods, and see the execution flow.
    {
        employee otheremployee;
        otheremployee = (employee)obj;
        return (obj.GetHashCode() == otheremployee.GetHashCode());

    }
    public override int GetHashCode()    //When Running this entire code, put a break-point on both the Equals() and GetHashCode() methods, and see the execution flow.
    {
        //int temp = base.GetHashCode(); // DONT USE THIS
        //return base.GetHashCode();
        int temp = empname.GetHashCode() + location.GetHashCode() + kinid.GetHashCode() + managerKin.GetHashCode();
        return temp;
    }
}

public class manager
{
    public string managername { get; set; }
    public double kinid { get; set; }


   
    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }
}
public class program
{
    public static void Main()
    {
        employee emp = new employee();
        employee emp2 = new employee();
        manager mng = new manager();
        manager mng2 = new manager();

        emp.empname = "Deepak";
        emp.location = "Pune";
        emp.kinid = 36885;
        emp.managerKin = 007;


        emp2.empname = "Astha";
        emp2.location = "Pune";
        emp2.kinid = 30000;
        emp2.managerKin = 001;

        mng.kinid = 007;
        mng.managername = "Gaurav";
        mng2.kinid = 001;
        mng2.managername = "Surya";

        Dictionary<employee, manager> relations = new Dictionary<employee, manager>();
        relations.Add(emp, mng); // put a BreakPoint here and see the execution flow
        relations.Add(emp2, mng2);// put a BreakPoint here and see the execution flow

        Console.ForegroundColor = ConsoleColor.Yellow;
        Console.WriteLine("The Employee details are :");
        foreach (var element in relations)
            Console.WriteLine(" \n Employee Name : {0} \n Location : {1} \n Employee KinId : {2} \n Manager's KinId : {3} ",
                element.Key.empname, element.Key.location, element.Key.kinid, element.Key.managerKin);

        Console.WriteLine("Enter the details of the Employee..");
        Console.ForegroundColor = ConsoleColor.Gray;
        Console.Write("\nEmployee Name : "); string ename = Console.ReadLine();
        Console.Write("Location : "); string elocn = Console.ReadLine();
        Console.Write("Employee KinId : "); double ekinid = Convert.ToDouble(Console.ReadLine());
        Console.Write("Manager's ID : "); double emngr = Convert.ToDouble(Console.ReadLine());
        employee emp1 = new employee();
        emp1.empname = ename;
        emp1.location = elocn;
        emp1.kinid = ekinid;
        emp1.managerKin = emngr;


        int i = 0; // This variable acts as a indicator to find whether the Employee Key exists or not.
        if (relations.ContainsKey(emp1)) //Put a break point here and see the execution flow.
        {
            Console.WriteLine("the Employee : {0} exists..", emp1.empname);
            Console.WriteLine("the Employee reports to the following manager : {0} \n and the Manager's KinId is {1}.", (relations[emp1]).managername, relations[emp1].kinid);
            i = 1;
            Console.ReadLine();
        }

        if (i == 0)
        {
            Console.WriteLine("the details of the employee named {0} does not exist !!", emp1.empname);
            Console.ReadLine();
        }

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

字典 C# 中的 GetHashCode 和 Equals 实现 的相关文章

  • 如何自定义 DataTable 列的排序

    我需要对数据表列的值进行排序 该列包含字符串 整数或混合文本 例如 数据表列包含如下值 23 18 12 store 23 store a1 1283 25 如果我使用对值进行排序Dataview sort 方法会按此顺序产生 12 128
  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • 有没有比这更快的方法来查找目录和所有子目录中的所有文件?

    我正在编写一个程序 需要在目录及其所有子目录中搜索具有特定扩展名的文件 这将在本地驱动器和网络驱动器上使用 因此性能是一个问题 这是我现在使用的递归方法 private void GetFileList string fileSearchP
  • 使用 C# 使用应用程序密码登录 Office 365 SMTP

    在我们的 Office 365 公司帐户中实施两步身份验证之前 我的 C WPF 程序已成功进行身份验证并发送邮件 我使用了 SmtpClient 库 但现在我必须找到另一个解决方案 因为它不再起作用 我找不到任何使用 O365 应用程序密
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • 对数字进行向上和向下舍入 C++

    我试图让我的程序分别向上和向下舍入数字 例如 如果数字是3 6 我的程序应该四舍五入最接近的数字 4 如果该数字是3 4 它将向下舍入为 3 我尝试使用ceil库获取 3 个项目的平均值 results ceil marks1 marks2
  • 阅读 Stack Overflow RSS 源

    我正在尝试获取未回答问题的列表the feed https stackoverflow com feeds 但我在阅读时遇到困难 const string RECENT QUESTIONS https stackoverflow com f
  • 捕获当前正在播放的声音

    是否可以捕获计算机上当前播放的声音 如果能够将其保存为 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
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • 为什么 C 函数不能返回数组类型?

    我是 C 语言新手 想知道 为什么 C 函数不能返回数组类型 我知道数组名是数组第一个值的地址 而数组是 C 中的二等公民 您自己已经回答了这个问题 数组是二等公民 C 按值返回 数组不能按值传递 因此不能返回它们 至于为什么数组不能按值传
  • 便携式终端

    有没有办法根据所使用的操作系统自动使用正确的 EOL 字符 我在想类似的事情std eol 我知道使用预处理器指令非常容易 但很好奇它是否已经可用 我感兴趣的是 我的应用程序中通常有一些消息 稍后我会将这些消息组合成一个字符串 并且我希望将
  • 改进C++逐行读取文件的能力?

    我正在解析大约 500GB 的日志文件 我的 C 版本需要 3 5 分钟 我的 Go 版本需要 1 2 分钟 我正在使用 C 的流来流式传输文件的每一行以进行解析 include
  • C# - 为什么我需要初始化 [Out] 参数

    我有几个从本机 dll 导入的方法 使用以下语法 internal static class DllClass DllImport Example dll EntryPoint ExampleFunction public static e
  • 在 unix 中编译 dhrystone 时出错

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

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

    关系到这个答案 https stackoverflow com a 48446491 596758 我试图通过设置让多个上下文工作UseInMemoryDatabase以同名 下面的测试失败 第二个上下文为空 我还需要做什么才能在内存数据库
  • 如何使复选框不可选择?

    我想知道你是怎么做的CheckBox在c 中无法选择 我认为这会是类似 SetSelectable false 之类的东西 但我似乎看不到该方法 I found CanSelect但这似乎是只读属性 您可以设置自动检查 http msdn
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐

  • 我可以在没有转译器的情况下使用 JSPM 吗?

    我正在使用 jspm 0 16 2 我正在用这个测试项目 https github com caasjj jspm tut 当我将转换器设置为无时 transpiler none 我收到一个错误XHR error 404 Not Found
  • 在动态库中包含静态库

    我有以下问题 几个目标文件 a1 o a2 o a3 o 存档 libxxxx a 存档 libxxxx a 仅包含目标文件 b1 o b2 o 等 我想从所有目标文件创建一个共享库 so 问题 如果我使用 g shared libxxxx
  • 什么是适合 C++ 的优秀 HTML 模板引擎? [复制]

    这个问题在这里已经有答案了 可能的重复 C HTML 模板框架 模板化库 HTML 生成器库 https stackoverflow com questions 355650 c html template framework templa
  • 使用异步 Socket.BeginReceive 时如何检测超时?

    在 F 中使用原始套接字编写异步 Ping 以使用尽可能少的线程启用并行请求 不使用 System Net NetworkInformation Ping 因为它似乎为每个请求分配一个线程 我也对使用 F 异步工作流程感兴趣 当目标主机不存
  • 是否可以为 fontawesome 图标着色?

    我可以更改字体颜色 但不能更改 填充 我首先尝试设置背景颜色 但这填充了整个图标框区域 例如 我有 i class icon star empty icon large i 但我希望它是黄色的 编辑 用例是我想要一个 最喜欢的 图标为灰色轮
  • 如何根据 Terraform 中 for_each 中的映射值设置 EC2 资源实例计数

    对于以下 Terraform 代码 我希望最终得到 2 个测试沙箱开发实例和 1 个测试沙箱测试实例 我希望能够从地图值中得出计数instance count 我尝试过使用count但 Terraform 不允许用户这样做for each
  • 如果已经运行,则阻止应用程序启动[重复]

    这个问题在这里已经有答案了 我的应用程序需要在启动时检查并查看它是否已经在运行 这样它就不会再次打开 我有一个系统托盘图标 可以使应用程序可见 False 效果很好 然而 如果应用程序已经在运行 我需要确保用户查看系统托盘中的通知图标 Pr
  • 在 Extjs 中播放视频

    我在我的一个项目中使用 Extjs 和 PHP 无框架 我需要在同一面板 选项卡上播放视频而不打开新的面板 选项卡 我可以通过单击下载按钮或单击面板上显示的视频链接来下载视频 但我需要在同一页面上播放视频而不影响其质量 通常使用 mp4 视
  • File:// 链接在所有浏览器中都不执行任何操作

    我正在生成一个链接 如下所示 a target blank title Test href Test a 该链接位于 iframe 内 当我点击它时 在任何主流浏览器中 nothing发生 Fiddler 没有记录任何流量 将 URL 粘贴
  • C# 中的这种链接称为什么?

    你能告诉我这是什么类型的 C 构造吗 Code Golf 与 Excel 列名称等效的数字 https stackoverflow com questions 2634427 code golf numeric equivalent of
  • phonegap 3.1 BarcodeScanner 未捕获模块 cordova/plugin/BarcodeScanner 未找到

    我是 Phonegap 和 JS 的新手 我用条形码扫描仪尝试了 我通过本教程安装了 Phonegap 和所有内容http teusink blogspot com 2013 07 guide phonegap 3 android wind
  • QDataWidgetMapper 无法与 QLabels 一起使用

    我正在使用 QDataWidgetMapper 将数据映射到 QLineEdit 它工作正常 当我用于将数据映射到 QLabel 时 它不会在标签中显示任何数据 我尝试按以下方式执行此操作 QDataWidgetMapper testMap
  • 如何在提交期间忽略特定的 Subversion 子目录

    在我当前正在从事的项目中 有人决定将二进制文件作为源树的一部分签入 二进制文件位于源本身下方的目录中 project src Here is the location of the source code project src more
  • 在 Kotlin 中根据给定的键列表对映射进行切片

    给定一张地图和一个键列表 val abc mapOf 1 to a 2 to b 3 to c val keys listOf 1 2 如何获取仅包含由指定的键值对的映射keys 就像是 val ab abc slice keys equi
  • 执行随机方法[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在尝试制定执行随机方法的逻辑 比方说 我有 10 个方法 我需要运行随机选择的其中一个 main 方法将驻留在我的 Rails 3 2
  • 如何在 IOS 中将可调整大小的 UIView 的一个角圆化?

    我正在使用这段代码来修整我的一个角UIView UIBezierPath maskPath UIBezierPath bezierPathWithRoundedRect self view bounds byRoundingCorners
  • VSCode 内部正则表达式搜索与负向后查找

    在 VSCode 中 尝试搜索print and print 但前提是后面没有 这是我第一次尝试在 VSCode 中进行正则表达式搜索 例子 print Test One MATCH print Test Two MATCH print T
  • JS 自动转换括号中的文本与特定标记(包括匹配)

    页面加载后 我想找到正文中封装在括号中的所有文本 这是一个示例 并将其替换为以下内容
  • git 如何处理将另一个存储库克隆到子目录中?

    我刚刚将一个存储库克隆到另一个存储库的子目录中 而 git 实际上似乎可以非常智能地处理这种情况 我了解子模块 但我认为它们总是必须明确定义 并且我不认为 git 有此功能 发生了什么 这是我的 shell 会话 https gist gi
  • 字典 C# 中的 GetHashCode 和 Equals 实现

    我来到这个网站搜索 Dictionary 中的对象比较 我发现重写 GetHashCode 和 Equals 是在 C 中进行对象比较的必须条件 这是我一直试图使用 FOREACH 迭代方法解决的一段代码 但由于性能问题 我的老板说要在不使