当前位置:  开发笔记 > 编程语言 > 正文

列表破碎或pebkac?

如何解决《列表破碎或pebkac?》经验,为你挑选了1个好方法。

通用列表(和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 HashSet SomeThing=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

没有,没有什么坏 - 但数组不会覆盖EqualsGetHashCode.所以a HashSet只是检查密钥所指的确切对象的存在.它不是在寻找"具有等效字节序列的数组".

你没有添加test5到集合中,所以SomeThing.Contains(test5)不会是真的 - 并且调用SomeThing.Contains(anyListOfByte.ToArray())将返回false,因为每次都会创建一个新数组.

如果要HashSet使用不同的相等含义,可以通过传递IEqualityComparer给构造函数来实现.



1> Jon Skeet..:

没有,没有什么坏 - 但数组不会覆盖EqualsGetHashCode.所以a HashSet只是检查密钥所指的确切对象的存在.它不是在寻找"具有等效字节序列的数组".

你没有添加test5到集合中,所以SomeThing.Contains(test5)不会是真的 - 并且调用SomeThing.Contains(anyListOfByte.ToArray())将返回false,因为每次都会创建一个新数组.

如果要HashSet使用不同的相等含义,可以通过传递IEqualityComparer给构造函数来实现.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有