列表已损坏或pebkac
本文关键字:pebkac 已损坏 列表 | 更新日期: 2023-09-27 18:26:27
泛型列表(和HashSet)已损坏,或者。。。pebkac
这个不值得的测试程序输出以下内容:
系统字节[]6:2 3 4 5 6 7正确//如预期系统字节[]6:3 4 5 6 7 8正确//如预期系统字节[]6:3 4 5 6 7 8错误//oops。。。出了很大的问题系统字节[]6:3 4 5 6 7 8错误//oops。。。出了很大的问题
我只是不明白,真的不明白为什么最后两个是"错误的":-/
using System.Collections.Generic;
using System.Collections;
using System;
public class HashSetTest {
public static HashSet<byte[]> SomeThing=new HashSet<byte[]>();
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<byte> test4=new List<byte>();
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));
}
}
没有,没有任何损坏,但数组不会覆盖Equals
或GetHashCode
。因此,HashSet<byte[]>
只是在检查键所指的确切对象的存在。它不是在寻找"具有等效字节序列的数组"。
您还没有将test5
添加到集合中,所以SomeThing.Contains(test5)
不会为true,调用SomeThing.Contains(anyListOfByte.ToArray())
将返回false,因为每次都会创建一个新数组。
如果希望HashSet<T>
使用不同意义的相等,可以通过将IEqualityComparer<T>
传递给构造函数来实现。
您正在测试引用相等性。test4.ToArray()
、test5
和SomeThing
都是不同的对象。