当前位置: 代码迷 >> C# >> Dictionary的ContainsValue解决方案
  详细解决方案

Dictionary的ContainsValue解决方案

热度:68   发布时间:2016-05-05 03:01:53.0
Dictionary的ContainsValue
 Dictionary<int,String[]> test=new Dictionary<int,String[]>();
 test.Add(1, new String[2]{“你”,"好”});

 a = test.ContainsValue(new String[2]{“你”,"好”}));
Dictionary里面的确包含这个数组,但是a的值为什么一直为false,应该是true才对啊
------解决思路----------------------
你需要补充一下值类型与引用类型的知识
http://blog.csdn.net/jiankunking/article/details/44281215
http://blog.csdn.net/jiankunking/article/details/42128907
------解决思路----------------------
new String[2]{“你”,"好”} 两次是不同的实例了 虽然内容一样 但属于不同的实例
写成这样就可以了

           String[] temp = new String[2]{"你", "好"};
            Dictionary<int,String[]> test=new Dictionary<int,String[]>();
            test.Add(1, temp);
            bool a = test.ContainsValue(temp);

------解决思路----------------------
new String[2]{“你”,"好”}  跟  new String[2]{“你”,"好”} 根本不想等。
------解决思路----------------------
你这种情况,需要在创建Dictionary的时候传入一个比较器
------解决思路----------------------
引用:
Quote: 引用:

new String[2]{“你”,"好”} 两次是不同的实例了 虽然内容一样 但属于不同的实例
写成这样就可以了

           String[] temp = new String[2]{"你", "好"};
            Dictionary<int,String[]> test=new Dictionary<int,String[]>();
            test.Add(1, temp);
            bool a = test.ContainsValue(temp);

我不能直接 让ContainValue(temp)的话怎么做,因为我需要从别的地方判断那里是否有信息存在与字典中,而不是直接把字典中的东西拿来用,除了最后一步我实际代码是和你相同的。

如果别的地方是用New实例存下来,那必须把这些保存下来,  不然每次new的都是不同的对象,  除非你用值类型,或者字符串.
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

new String[2]{“你”,"好”} 两次是不同的实例了 虽然内容一样 但属于不同的实例
写成这样就可以了

           String[] temp = new String[2]{"你", "好"};
            Dictionary<int,String[]> test=new Dictionary<int,String[]>();
            test.Add(1, temp);
            bool a = test.ContainsValue(temp);

我不能直接 让ContainValue(temp)的话怎么做,因为我需要从别的地方判断那里是否有信息存在与字典中,而不是直接把字典中的东西拿来用,除了最后一步我实际代码是和你相同的。

如果别的地方是用New实例存下来,那必须把这些保存下来,  不然每次new的都是不同的对象,  除非你用值类型,或者字符串.


是因为数组看的是地址的问题吗

是的  你可以将存进去的数组传参到你需要的地方,或者定义为全局的
------解决思路----------------------
        struct stringArray : IEquatable<stringArray>
        {
            string[] array;
            public static implicit operator stringArray(string[] array) { return new stringArray { array = array }; }
            public static implicit operator string[](stringArray array) { return array.array; }
            public bool Equals(stringArray other)
            {
                if (array == null) return other.array == null;
                if (array.Length == other.array.Length)
                {
                    int index = 0;
                    foreach (string value in other.array) if (value != array[index++]) return false;
                    return true;
                }
                return false;
            }
        }
            Dictionary<int, stringArray> test = new Dictionary<int, stringArray>();
            test.Add(1, new string[2] { "你", "好" });
            Console.WriteLine(test.ContainsValue(new string[2] { "你", "好" }));

------解决思路----------------------
你在开玩笑吧?数组能这样比较吗?
new String[2]{“你”,"好”} == new String[2]{“你”,"好”}

------解决思路----------------------
引用:
按你的方法试了,还是false怎么办
不知道你的.NET是哪个版本,我4.0没有问题。
不行的话,试试重载=运算符。
如果你要做Key使用的话,要重写GetHashCode与Equals(object)。
------解决思路----------------------
比的是引用,当然不相等了
------解决思路----------------------
引用:
Quote: 引用:

你需要补充一下值类型与引用类型的知识
http://blog.csdn.net/jiankunking/article/details/44281215
http://blog.csdn.net/jiankunking/article/details/42128907

Dictionary<int,String> test=new Dictionary<int,String>();
 test.Add(1, “你”});

 a = test.ContainsValue(“你”));
如果不是数组a显示的就是true,a是bool型的,但是我把Value定义成数组就会出问题,请你具体说一下好吗

你做是一个实体类,应该也会出问题吧。这个真心没什么好讲的
就是两个概念的问题,你好好理解一下吧
------解决思路----------------------


Dictionary<int,String[]> test=new Dictionary<int,String[]>();
var temp= new String[2]{“你”,"好”};
 test.Add(1,temp);

 a = test.ContainsValue(temp);



这样保证一样。。。
  相关解决方案