断言A中的所有属于B,B中的所有属于A

时间:2010-01-24 23:22:07

标签: c# .net linq

我很自豪能够自己制作这个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是否相等。

有更好的方法吗?

3 个答案:

答案 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);
}