.net – 集合上的递归断言

我想要像这样的测试:

[Test]
    public void TestCollectionAssert ()
    {
        var a1 = new [] { new [] { "a" } };
        var a2 = new [] { new [] { "a" } };

        Assert.AreNotEqual (a1, a2);
        //CollectionAssert.AreEqual (a1, a2);
        CollectionAssert.AreEquivalent (a1, a2);
    }

通过.
我的实际案例更复杂,但以通用方式解决这个问题就行了.
有任何想法吗?

最佳答案 有一个名为
SequenceEqual()的有用LINQ运算符,用于比较两个序列的相等性. SequenceEqual()遍历任何两个IEnumerable<>序列并验证它们具有相同数量的元素,并且相同索引处的元素相等(使用默认的相等比较器).但是,由于您具有嵌套集合,因此您还需要扩展相等概念以应用于它们.幸运的是,有一个重载允许您提供自己的IEqualityComparer<>宾语.

由于不断定义一个提供相等语义的类很尴尬,我编写了一个允许你使用委托的通用扩展.我们来看看代码:

public static class ComparerExt
{
    private class GenericComparer<T> : IEqualityComparer<T>
    {
        private readonly Func<T, T, bool> m_EqualityFunc;

        public GenericComparer( Func<T,T,bool> compareFunc )
        {
            m_EqualityFunc = compareFunc;
        }

        public bool Equals(T x, T y)
        {
            return m_EqualityFunc(x, y);
        }
    }

    // converts a delegate into an IComparer
    public static IEqualityComparer<T> AreEqual<T>( Func<T,T,bool> compareFunc )
    {
        compareFunc.ThrowIfNull("compareFunc");

        return new GenericComparer<T>(compareFunc);
    }
}

现在,我们可以很容易地比较两个序列:

Assert.IsTrue( 
   // check that outer sequences are equivalent...
   a1.SequenceEqual( a2,
                     // define equality as inner sequences being equal... 
                     ComparerExt.AreEqual( (a,b) => a.SequenceEqual(b) ) );
点赞