在将其标记为重复之前,请考虑以下简短程序:
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类型数组的单个元素,不是吗?
编辑:那么如何实现不获取异常意义来比较枚举中的元素以返回相等性?
实际的问题是你要比较两个long[]
,并且Enumerable.SequenceEquals
将使用一个ObjectEqualityComparer
(你可以通过检查EqualityComparer
内部使用的是什么来看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; } } }