Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 集合上的递归断言_.net_Collections_Nunit_Assert - Fatal编程技术网

.net 集合上的递归断言

.net 集合上的递归断言,.net,collections,nunit,assert,.net,Collections,Nunit,Assert,我想要一个这样的测试: [Test] public void TestCollectionAssert () { var a1 = new [] { new [] { "a" } }; var a2 = new [] { new [] { "a" } }; Assert.AreNotEqual (a1, a2); //CollectionAssert.AreEqual (a1, a2); Colle

我想要一个这样的测试:

[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);
    }
通过。 我的真实案例更复杂,但用一般方法解决这个问题就行了。
有什么想法吗?

您可以编写一个如下所示的扩展方法

public class AssertExtension
{
    public bool AreSimilar<T>(this CollectionAssert, IList<T> list1, IList<T> list2)
    {
        // ...
    }
}
公共类资产扩展
{
公共布尔相似(此集合资产,IList列表1,IList列表2)
{
// ...
}
}

问题当然是如何比较这两个列表。我建议您逐步浏览一个列表中的元素,并尝试从另一个列表中删除它们。如果在执行此操作时出现问题,或者在最后留下了不相似的对象。

有一个名为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);
    }
}

这是一个老问题,但有人刚刚在nunit讨论列表上发布了一个链接,所以我会回答


NUnit旨在报告两个列表相等。这就是它的工作原理。Assert.NotEqual实际上应该失败。

它们是否应该相等?数组中的位置相关吗?它们是相等的,所以我希望是相等的。我知道为什么它不起作用。然而,我正在寻找一些通用的解决方案的问题。嗯,我在找它。我通过实现一个特殊的比较器“本地”解决了这个问题,但是当我的集合类型改变时,我需要修改比较器。。。因此,我希望有人能想出一个好的解决方案:)这似乎可以解决问题,但它仍然只适用于1级嵌套集合,因此不是真正的通用解决方案:)在我的真实案例中,我有KeyValuePair[],您解决问题的方法似乎也是如此complicated@wysek:所以当你说你在寻找一个通用的解决方案时,你的意思是任何级别的嵌套?这在你的问题中并不清楚。让我们知道如果是这样的话。我一直在寻找一个已经存在的工具。。。但似乎没有。为此,我已经实现了自己的非通用比较器,不过感谢您的努力!你的建议会修改其中一个列表,我认为这是不可接受的。另外,删除一个项目无论如何都会调用Equals(),并且它不会像我希望的那样工作:)您可以通过复制一个列表来避免修改其中一个列表,但是您是对的,解决方案不是很舒服。
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) ) );