C# 通用字典 TryGetValue 找不到键

2024-03-02

我有这个简单的例子:

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<MyKey, string> data = new Dictionary<MyKey, string>();
            data.Add(new MyKey("1", "A"), "value 1A");
            data.Add(new MyKey("2", "A"), "value 2A");
            data.Add(new MyKey("1", "Z"), "value 1Z");
            data.Add(new MyKey("3", "A"), "value 3A");

            string myValue;
            if (data.TryGetValue(new MyKey("1", "A"), out myValue))
                Console.WriteLine("I have found it: {0}", myValue );

        }
    }

    public struct MyKey
    {
        private string row;
        private string col;

        public string Row { get { return row; } set { row = value; } }
        public string Column { get { return col; } set { col = value; } }

        public MyKey(string r, string c)
        {
            row = r;
            col = c;
        }
    }
}

这工作正常。但是如果我通过 MyKey 类更改 MyKey 结构:

public class MyKey

然后方法TryGetValue尽管钥匙就在那里,但没有找到任何钥匙。

我确信我错过了一些明显的东西,但我不知道是什么。

任何想法 ?

Thanks


** 解决方案 **

(请参阅已接受的解决方案以获得更好的 GetHashCode 解析)

我已经像这样重新定义了 MyKey 类,现在一切正常:

public class MyKey
{
    private string row;
    private string col;

    public string Row { get { return row; } set { row = value; } }
    public string Column { get { return col; } set { col = value; } }

    public MyKey(string r, string c)
    {
        row = r;
        col = c;
    }

    public override bool Equals(object obj)
    {
        if (obj == null || !(obj is MyKey)) return false;

        return ((MyKey)obj).Row == this.Row && ((MyKey)obj).Column == this.Column;
    }

    public override int GetHashCode()
    {            
        return (this.Row + this.Column).GetHashCode();
    }    
}

感谢所有回答这个问题的人。


你需要覆盖Equals() and GetHashCode()在课堂里MyKey

也许是这样的:

获取哈希码()

public override int GetHashCode()
{
   return GetHashCodeInternal(Row.GetHashCode(),Column.GetHashCode());
}
//this function should be move so you can reuse it
private static int GetHashCodeInternal(int key1, int key2)
{
    unchecked
    {
        //Seed
        var num = 0x7e53a269;

        //Key 1
        num = (-1521134295 * num) + key1;
        num += (num << 10);
        num ^= (num >> 6);

        //Key 2
        num = ((-1521134295 * num) + key2);
        num += (num << 10);
        num ^= (num >> 6);

        return num;
    }
}

Equals

public override bool Equals(object obj)
{
    if (obj == null)
        return false;
    MyKey p = obj as MyKey;
    if (p == null)
        return false;

    // Return true if the fields match:
    return (Row == p.Row) && (Column == p.Column);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 通用字典 TryGetValue 找不到键 的相关文章

随机推荐

  • Jetpack Compose Surface 单击波纹未根据形状进行剪裁?

    我有 3 个表面 如 gif 所示 当我单击波纹效果传播时 无需考虑表面的形状 哪些是用创建的 Composable fun SurfaceClickPropagationExample Provides a Context that ca
  • Perl-我在寻找什么功能?将多个规则分配给指定结果

    我在脑海中概念化了一个函数 我想象它存在 但如果它存在 我不知道它的名字 因此很难用谷歌搜索 假设我想定义两个结果 我将称之为Pass and Fail 我想要几个不同的规则适用于这两种结果 因此 为了清楚起见 希望如此 假设我有一个文件
  • 在 Three.js 中,Alpha 通道工作不一致

    我正在用 Three js 构建一个 剪纸 世界 我的所有模型都是简单的 平面 我使用带有 Alpha 通道的 PNG 来对它们进行纹理处理 以将平面修剪成更令人愉悦的形状 奇怪的是 根据飞机的位置和相机的位置 透明度不可预测地出现和消失
  • 检查数据帧是否包含任何空值

    我有一个数据框 需要查看它是否包含空值 关于同一主题的帖子有很多 但几乎所有帖子都使用count行动或show方法 count在我的例子中 由于数据量很大 操作的成本非常高 同样对于show method 有没有一种方法可以让 Spark
  • 在类中使用 PDO [重复]

    这个问题在这里已经有答案了 我有一些类执行一些 MySQL 查询和准备好的语句 然而 我不知道如何将我的 PDO 对象合并到这些类中 例如 我想做这样的事情 不幸的是 它不起作用 谁能建议一种优雅的方法来做到这一点 谢谢你的时间 抱歉 我是
  • 动态组装scrapy GET请求字符串

    我一直在使用 firebug 并且有以下字典来查询 api url htp my url aspx top querystring dbkey x1 stype id s 27 headers accept text html applic
  • qt webengine将javascript输出重定向到GUI

    我有一个可以查看页面的应用程序QWebEngineView小部件如何将我的 javascript 控制台日志重定向到我的 GUI 它当前显示在我的调试输出中 您必须子类化 QWebEnginePage 才能覆盖 javaScriptCons
  • 使用immulator时在android studio中使用protocol=http/1.1、code=200在Retrofit中获取F响应

    我正在从 Nodejs 本地服务器调用 API API正在调用 但Retrofit的respose body中没有数据 代码 200 和消息 OK 我收到以下回复 Response protocol http 1 1 code 200 me
  • FlexSlider 2 标题在 chrome 上闪烁

    我在 chrome 上的标题有些闪烁 http tyni cc flexsliderissue http tyni cc flexsliderissue在野生动物园中一切都运行良好 任何人都知道出了什么问题吗 谢谢 丹尼尔 我经常使用 Fl
  • React hooks - 当状态更改为相同值时如何强制 useEffect 运行?

    所以我正在构建一个鼓垫类型的应用程序 除了这个之外 几乎所有东西都可以正常工作 编辑 把整个东西放在codesandbox上 如果有人想看的话 codesandbox io s sleepy darwin jc9b5 file src Ap
  • 连接到存储在 Azure VM 上的 Nexus 3 Preview 上的 Docker 注册表时出现问题

    基本上 我在连接到我尝试使用最新的 Nexus 预览版创建的 docker 注册表时遇到了问题 首先 我在运行 Ubuntu 14 04 trusty 的 MS Azure 云服务器上安装了 Sonotype Nexus 3 Preview
  • 如何在 PHP 中使用 UTF-8 支持替换所有非字母字符

    我想从字符串中删除所有非字母字符 问题是我不知道字母范围 因为它是 UTF8 字符串 可以是英语 我通常会做这样的事情 str preg replace a zA Z str or str preg replace w u str 但它们都
  • CSS 打印预览 - 显示图像/链接 URL

    我正在创建一个打印样式表 并且希望通过在链接和图像旁边显示链接 URL 来使网站尽可能易于访问 对于简单的链接我找到了这个解决方案 http davidwalsh name optimize your links for print usi
  • 如何在 Android 手机上签署“.apk”文件?

    我想在手机上生成一个新的 apk 文件 我的应用程序市场中的一个功能 如应用程序 我必须在安装它之前对其进行签名 我想我必须在手机上运行 JarSigner JarSigner 存在于以下两个项目中 OpenJDK 和 GCC libjav
  • 使 clos 对象可在 lisp 中打印

    如果你想让 common lisp 中的 CLOS 对象可打印 可读打印 你如何在不使用除了 print 和 read 之外的任何东西的情况下做到这一点 至少在我的解决方案中 有两个部分可以做到这一点 但是您将需要这个功能 感谢 cl pr
  • Django API 请求

    我正在尝试使用模型的字段作为 API 请求中的关键字来访问另一个服务的 API URL 会像这样 http api example com json first name FNAME last name LNAME key key 这是我的
  • 使用 sed 计算反向引用

    我想 pm max children 5 成为 pm max children 8 并一直在努力但没有得到解决方案 像 1 或 2 这样的反向引用似乎不适用于计算 sed i E s pm max children s 1 echo 2 3
  • 这个字符串是什么:Ôªø 以及如何避免它?

    不知何故 我设法将 放在 PHP 脚本的顶部 那群可怕的人物到底是什么 我怎么可能进入其中 以及将来我该如何揭露和 或避免它 有趣的是 它之前潜伏在 PHP 脚本的最顶部
  • Cloudera 5.1下作业在LocalJobRunner中保持运行

    需要一些快速帮助 我们的作业在 MapR 下运行良好 但是当我们在 Cloudera 5 1 上启动相同的作业时 它继续以本地模式运行 我确信这是某种配置问题 它是哪个配置设置 14 08 22 12 16 58 INFO mapreduc
  • C# 通用字典 TryGetValue 找不到键

    我有这个简单的例子 using System using System Collections Generic namespace ConsoleApplication1 class Program static void Main str