我很自豪能够自己制作这个Linq断言:
bool assert1 = (from e in A
select B.Contains<T>(e, new TComparer()))
.All(x => x == true);
bool assert2 = (from e in B
select A.Contains<T>(e, new TComparer()))
.All(x => x == true);
Assert(assert1 && assert2);
这将通过包含相同的元素(即A⊆B和B⊆A)来检查A和B是否相等。
有更好的方法吗?
答案 0 :(得分:3)
我会这样做:
IComparer<T> comparer = new TComparer();
bool equal = !A.Except(B, comparer).Any() && !B.Except(A, comparer).Any();
答案 1 :(得分:2)
您使用什么库进行断言?如果它是NUnit,那么有一个带有AreEquivalent()方法的CollectionAssert类只是为了这种事情。
Linq对于集合转换非常优雅,但这是一项非常精确的任务,如果集合足够大,它会受到巨大的性能影响。你需要一个基于Hashtable的临时集合(HashSet或Dictionary),它有专门的方法来快速完成。
答案 2 :(得分:0)
怎么样:
Assert.IsTrue(A.SequenceEqual(B, new SomeEqualityComparer()));
在评论中澄清之后,我正在添加序列的排序。无论如何,两个序列都应该包含相同数量的元素。
OrderSequence(A).SequenceEqual(OrderSequence(B), new SomeEqualityComparer());
private static IEnumerable<StudentClass> OrderSequence(IEnumerable<StudentClass> left)
{
IComparer<StudentClass> comparer = new TComparer();
return left.OrderBy(a => a, comparer);
}