【问题标题】:Assert all in A belongs to B and all in B belongs to A断言 A 中的所有都属于 B,B 中的所有都属于 A
【发布时间】:2010-01-24 23:22:07
【问题描述】:

我很自豪能够自己产生这个 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 是否相等,即 A ⊆ B 和 B ⊆ A。

有没有更漂亮的方法来做到这一点?

【问题讨论】:

标签: c# .net linq


【解决方案1】:

我会这样做:

IComparer<T> comparer = new TComparer();
bool equal = !A.Except(B, comparer).Any() && !B.Except(A, comparer).Any();

【讨论】:

    【解决方案2】:

    您使用什么库进行断言?如果它是 NUnit,那么有一个带有 AreEquivalent() 方法的 CollectionAssert 类就是为了这种事情。

    Linq 可以非常优雅地用于集合转换,但这是一种确切的任务,如果集合足够大,它会对性能造成巨大影响。您需要一个基于 Hashtable 的临时集合(HashSet 或 Dictionary),并使用专门的方法来快速完成。

    【讨论】:

    • 好点。但是,在我的特殊情况下,这些集合是在 MbUnit 中测试相等性的对象的成员(我相信语法中的 ==NUnit),所以上面是从实际断言中检查了一些调用。这些集合在大多数情况下
    【解决方案3】:

    怎么样:

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

    【讨论】:

    • Enumerable.SequenceEqual(other) 仅当它们作为序列相等时才为真;即,它们具有相同数量的元素,A.First() 等于 B.First()(根据SomeEqualityComparer),A.Skip(1).First() 等于B.Skip(1).First()(根据SomeEqualityComparer),等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多