比较两个序列是否相等

2024-05-01

在因其标题而将其标记为重复之前,请考虑以下简短程序:

static void Main()
{
    var expected = new List<long[]> { new[] { Convert.ToInt64(1), Convert.ToInt64(999999) } };
    var actual = DoSomething();
    if (!actual.SequenceEqual(expected)) throw new Exception();
}

static IEnumerable<long[]> DoSomething()
{
    yield return new[] { Convert.ToInt64(1), Convert.ToInt64(999999) };
}

我有一个返回 long 类型数组序列的方法。为了测试它,我编写了一些类似于其中的测试代码Main.

然而我得到了例外,但我不知道为什么。预期的序列不应该与实际返回的序列相比较还是我错过了什么?

对我来说,它既是方法又是epxected恰好包含一个包含 long 类型数组的元素,不是吗?

编辑:那么我如何实现不获得异常含义来比较枚举中的元素以返回相等性?


真正的问题是你正在比较两个long[], and Enumerable.SequenceEquals将使用一个ObjectEqualityComparer<Int64[]>(你可以通过检查看到EqualityComparer<long[]>.Default这是内部使用的Enumerable.SequenceEquals),它将比较这两个数组的引用,而不是实际的values存储在数组内部,这显然不一样。

为了解决这个问题,你可以编写一个自定义的EqualityComparer<long[]>:

static void Main()
{
    var expected = new List<long[]> 
                       { new[] { Convert.ToInt64(1), Convert.ToInt64(999999) } };
    var actual = DoSomething();

    if (!actual.SequenceEqual(expected, new LongArrayComparer()))
        throw new Exception();
}

public class LongArrayComparer : EqualityComparer<long[]>
{
    public override bool Equals(long[] first, long[] second)
    {
        return first.SequenceEqual(second);
    }

    // GetHashCode implementation in the courtesy of @JonSkeet
    // from http://stackoverflow.com/questions/7244699/gethashcode-on-byte-array
    public override int GetHashCode(long[] arr)
    {
        unchecked
        {
            if (array == null)
            {
                return 0;
            }

            int hash = 17;
            foreach (long element in arr)
            {
                hash = hash * 31 + element.GetHashCode();
            }

            return hash;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较两个序列是否相等 的相关文章

随机推荐