热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

字典中的key为数组,在查找的时候如何操作?

例如声明一个字典类型的变量,key为int[]类型,往字典中添加时,通过Dictionary.Add(new[]{i,i},i^2)的方式添加,那么在调用这个字典中的成员时如果我使用Dictiona
例如声明一个字典类型的变量,key为int[]类型,往字典中添加时,通过Dictionary.Add(new[]{i,i}, i^2)的方式添加,那么在调用这个字典中的成员时如果我使用Dictionary[new[]{1,1}]的方式查找,会报给定关键字不在字典中的错误。这个有什么比较好的解决办法吗?

9 个解决方案

#1


[你实例化dictionary时试试这个
//
        // 摘要:
        //     初始化 System.Collections.Generic.Dictionary 类的新实例,该实例为空且具有默认的初始容量,并使用指定的
        //     System.Collections.Generic.IEqualityComparer
        //
        // 参数:
        //   comparer:
        //     比较键时要使用的 System.Collections.Generic.IEqualityComparer 实现,或者为 null,以便为键类型使用默认的
        //     System.Collections.Generic.EqualityComparer
        public Dictionary(IEqualityComparer comparer);
, 1楼说的没错
static void Main(string[] args)
        {
            //测试数据
            Dictionary d = new Dictionary(new ArrEqualityComparer());
            int[] a = { 1, 2, 3 };
            string b = "hello";
            d.Add(a, b);

            //使用新实例的 key查找
            int[] a1 = { 1, 2, 3 };
            Console.WriteLine(d[a1]);

            Console.ReadLine();
        }

        //重写key的判断方法
        public class ArrEqualityComparer : IEqualityComparer
        {
            public bool Equals(int[] b1, int[] b2)
            {
                bool result = true;
                for (int i = 0; i < b1.Length; i++)
                {
                    if (b1[i] != b2[i])
                    {
                        result = false;
                        break;
                    }
                    
                }
                return result;
            }

            public int GetHashCode(int[] arr)
            {
                int hCode = arr.Sum();
                return hCode.GetHashCode();
            }
        }
, @正怒月神 @巴士上的邂逅 解决了,非常感谢!, C# 没有给 int[] 设计比较相等的方法,因此你需要自己给出。#2 的代码就是的

当然,你也可以弄的再宽松些
将 public bool Equals(int[] b1, int[] b2) 方法体写作 return b1.Except(b2).Count() == 0;
这样 new [] {1, 2} 和 new [] {2, 1} 就可视为相等的了, 老兄我觉得你换个思路吧,你这真是艺高人胆大啊 。你那是个可变数组 你怎么 找啊 。你先用一个KEY 吧数组放进去,然后在放一下数值相对应的 VALUE 、这样就是会多一个中间变量 。你那样搞真的不好操作啊 ,而且你并不能保证你的KEY 是唯一的 。, 各位

还可以将你的数组key封装到一个class,然后让class重载==运算符,这样你的key还是“一个整体”

, 默认比较的是引用,所以数组不适合作为key,
引用 5 楼 mkbaoquan 的回复:
老兄我觉得你换个思路吧,你这真是艺高人胆大啊 。你那是个可变数组 你怎么 找啊 。你先用一个KEY 吧数组放进去,然后在放一下数值相对应的 VALUE 、这样就是会多一个中间变量 。你那样搞真的不好操作啊 ,而且你并不能保证你的KEY 是唯一的 。

@Jason_Mao1 是1#2#的方法有什么弊端吗?, 你这个有bug啊,两个一样的数组 int[] a = { 1, 2, 3 };但对于的值又不一样,  你怎么加到字典里呢]

推荐阅读
author-avatar
cryy5bl-1940
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有