在因其标题而将其标记为重复之前,请考虑以下简短程序:
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(使用前将#替换为@)