列表已损坏或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));
    }
}

列表已损坏或pebkac

没有,没有任何损坏,但数组不会覆盖EqualsGetHashCode。因此,HashSet<byte[]>只是在检查键所指的确切对象的存在。它不是在寻找"具有等效字节序列的数组"。

您还没有将test5添加到集合中,所以SomeThing.Contains(test5)不会为true,调用SomeThing.Contains(anyListOfByte.ToArray())将返回false,因为每次都会创建一个新数组。

如果希望HashSet<T>使用不同意义的相等,可以通过将IEqualityComparer<T>传递给构造函数来实现。

您正在测试引用相等性。test4.ToArray()test5SomeThing都是不同的对象