如果使用一个数组类型作为字典的key类型,使用string类型作为value类型,那么该如何通过一个数组来访问该字典的value?

请问在C#中,如果使用一个数组类型作为字典的key类型,使用string类型作为value类型,那么该如何通过一个数组来访问该字典的value?


Dictionary<int[], string> _ruleBase = new Dictionary<int[], string>(){...}

int [] myArr = {1,2,3};

_ruleBase[myArr]  ? //这样是找不到的

其实是可以的,但是要注意,比较的是引用,换言之,必须是用原来那个添加的对象,你不能再new一个数组,哪怕内容一样。

using System;
using System.Collections.Generic;
namespace HelloWorldApplication
{
   class HelloWorld
   {
      static void Main(string[] args)
      {
 
        Dictionary<int[], string> _ruleBase = new Dictionary<int[], string>(){};
        int[] myArr = {1,2,3};
        _ruleBase.Add(myArr, "a");  
        Console.WriteLine(_ruleBase[myArr]);
      }
   }
}

img

【以下回答由 GPT 生成】

在C#中,使用数组作为字典的键且值为字符串类型时,要想通过一个数组来访问该字典中的值,需要满足两个条件:

  1. 数组作为键的比较必须是通过值比较而不是引用比较。
  2. 数组作为键时,必须实现GetHashCodeEquals方法。

根据以上条件,我们可以使用Dictionary的另一个构造函数来创建自定义的IEqualityComparer<int[]>实例,用于比较和哈希化数组键的值。

下面是具体的解决方案:

using System;
using System.Collections.Generic;

public class ArrayEqualityComparer : IEqualityComparer<int[]>
{
    public bool Equals(int[] x, int[] y)
    {
        if (x == null && y == null)
            return true;
        if (x == null || y == null || x.Length != y.Length)
            return false;

        for (int i = 0; i < x.Length; i++)
        {
            if (x[i] != y[i])
                return false;
        }
        return true;
    }

    public int GetHashCode(int[] obj)
    {
        unchecked
        {
            int hash = 17;
            foreach (int element in obj)
            {
                hash = hash * 23 + element.GetHashCode();
            }
            return hash;
        }
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Dictionary<int[], string> _ruleBase = new Dictionary<int[], string>(new ArrayEqualityComparer())
        {
            { new int[] { 1, 2, 3 }, "Value1" },
            { new int[] { 4, 5, 6 }, "Value2" }
        };

        int[] myArr = { 1, 2, 3 };
        string value = _ruleBase[myArr]; // 通过数组访问字典的值

        Console.WriteLine(value);
    }
}

上述代码中,我们定义了一个ArrayEqualityComparer类,该类实现了IEqualityComparer<int[]>接口,并重写了EqualsGetHashCode方法,使其能够比较和哈希化数组的值。然后,在Dictionary<int[], string>实例化时,传入new ArrayEqualityComparer()作为参数,这样就能够实现通过数组访问字典的值。

Main方法中,我们创建了一个_ruleBase字典实例,其中包含了两个键值对。然后我们定义了一个myArr数组,通过_ruleBase[myArr]来访问字典中的值,并将其赋给value变量。最后,我们将value输出到控制台上。

这样就实现了通过一个数组来访问使用数组作为字典的键且值为字符串类型的字典中的值。



【相关推荐】


  • 这篇博客: 改动模型后,加载部分预训练权重文件中的 2在明确权重文件其实就是一个字典类的时候,那么我们就能了解,权重文件其实就是key+value,所谓key就是每一层的关键字,而value就是每一层的矩阵数据,下面以一份权重文件为例: 部分也许能够解决你的问题。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^