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

比较两个序列是否相等

如何解决《比较两个序列是否相等》经验,为你挑选了1个好方法。

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

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

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

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

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

对我而言,它看起来既是方法又epxected包含一个包含long类型数组的单个元素,不是吗?

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



1> Yuval Itzcha..:

实际的问题是你要比较两个long[],并且Enumerable.SequenceEquals将使用一个ObjectEqualityComparer(你可以通过检查EqualityComparer.Default内部使用的是什么来看Enumerable.SequenceEquals),这将比较这两个数组的引用,而不是存储在里面的实际数组,显然不一样.

要解决这个问题,您可以编写一个自定义EqualityComparer:

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

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

public class LongArrayComparer : EqualityComparer
{
    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;
        }
    }
}

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