通用列表(和HashSet)被破坏或者...... pebkac
这个不值得的测试程序输出如下:
System.Byte[] 6:2 3 4 5 6 7 True // as expected System.Byte[] 6:3 4 5 6 7 8 True // as expected System.Byte[] 6:3 4 5 6 7 8 False // oops ... something's very wrong System.Byte[] 6:3 4 5 6 7 8 False // oops ... something's very wrong
我只是不明白,真的不明白为什么最后两个是"假": - /
using System.Collections.Generic; using System.Collections; using System; public class HashSetTest { public static HashSetSomeThing=new HashSet (); public static void Write(byte[] pebkac) { Console.Write("{0}:",pebkac.Length); foreach(var i in pebkac) { Console.Write("{0} ",i); } Console.WriteLine(); } public static void Main() { byte[] test1= {1,2,3,4,5,6}; byte[] test2= {2,3,4,5,6,7}; byte[] test3= {3,4,5,6,7,8}; List test4=new List (); test4.AddRange(test3); byte[] test5=new byte[6]; var i=0; foreach(byte j in test3) { test5[i++]=j; } SomeThing.Add(test1); SomeThing.Add(test2); SomeThing.Add(test3); Console.WriteLine(test2); Write(test2); Console.WriteLine(SomeThing.Contains(test2)); Console.WriteLine(test3); Write(test3); Console.WriteLine(SomeThing.Contains(test3)); Console.WriteLine(test4.ToArray()); Write(test4.ToArray()); Console.WriteLine(SomeThing.Contains(test4.ToArray())); Console.WriteLine(test5); Write(test5); Console.WriteLine(SomeThing.Contains(test5)); } }
Jon Skeet.. 5
没有,没有什么坏 - 但数组不会覆盖Equals
或GetHashCode
.所以a HashSet
只是检查密钥所指的确切对象的存在.它不是在寻找"具有等效字节序列的数组".
你没有添加test5
到集合中,所以SomeThing.Contains(test5)
不会是真的 - 并且调用SomeThing.Contains(anyListOfByte.ToArray())
将返回false,因为每次都会创建一个新数组.
如果要HashSet
使用不同的相等含义,可以通过传递IEqualityComparer
给构造函数来实现.
没有,没有什么坏 - 但数组不会覆盖Equals
或GetHashCode
.所以a HashSet
只是检查密钥所指的确切对象的存在.它不是在寻找"具有等效字节序列的数组".
你没有添加test5
到集合中,所以SomeThing.Contains(test5)
不会是真的 - 并且调用SomeThing.Contains(anyListOfByte.ToArray())
将返回false,因为每次都会创建一个新数组.
如果要HashSet
使用不同的相等含义,可以通过传递IEqualityComparer
给构造函数来实现.