-4

目标

确保两个字符串数组相同,更具体地说,长度相同并且包含相同的项。

代码

所以,在我的单元测试中,我有以下代码:

var sut = new PersonValid();
var expected = new string[] { "Id", "FirstName", "LastName" };

Assert.AreEqual(expected.Length, sut.DataFields.Count);
Assert.AreEqual(0, sut.DataFields.Where(df => !expected.Contains(df)).Count());

它有效,但它真的没有那么优雅。一定有更好的方法不是吗?

4

4 回答 4

5

如果您也需要序列相等,那么:

您可以使用Enumerable.SequenceEqual

var IsEqual = sut.DataFields.SequenceEqual(expected);
于 2013-07-26T14:18:17.163 回答
1

使用类CollectionAssert

var sut = new PersonValid();
var expected = new string[] { "Id", "FirstName", "LastName" };    
CollectionAssert.AreEqual(expected, sut.DataFields)
于 2013-07-26T14:52:15.787 回答
1

你的问题没有完全说明。您没有数组定义“平等”。

特别是,顺序重要吗?物品数量呢?

如果订单确实很重要:

return first.SequenceEquals(second);

如果计数无关紧要

return !first.Except(second).Union(second.Except(first)).Any();

如果顺序无关紧要,计数重要,则需要如下方法:

public bool Compare<T>(T[] first, T[] second) {
    var firstItemCounts = first.GroupBy(x => x)
                               .ToDictionary(g => g.Key, g => g.Count());
    var secondItemCounts = second.GroupBy(x => x)
                                 .ToDictionary(g => g.Key, g => g.Count());
    foreach(var key in firstItemCounts.Keys.Union(secondItemCounts.Keys)) {
        if(!firstItemCounts.ContainsKey(key) ||
               !secondItemCounts.ContainsKey(key)
        ) {
            return false;
        }
        if(firstItemCounts[key] != secondItemCounts[key]) {
            return false;
        }
    }
    return true;
}
于 2013-07-26T14:22:44.840 回答
1

如果顺序很重要

使用Enumerable.SequenceEqual

来自上述链接的示例:

class Pet
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public static void SequenceEqualEx1()
{
    Pet pet1 = new Pet { Name = "Turbo", Age = 2 };
    Pet pet2 = new Pet { Name = "Peanut", Age = 8 };

    // Create two lists of pets.
    List<Pet> pets1 = new List<Pet> { pet1, pet2 };
    List<Pet> pets2 = new List<Pet> { pet1, pet2 };

    bool equal = pets1.SequenceEqual(pets2);

    Console.WriteLine(
        "The lists {0} equal.",
        equal ? "are" : "are not");
}

如果顺序不重要

首先对可枚举进行排序,然后如上所述使用 Enumerable.SequenceEqual。

于 2013-07-26T14:20:45.927 回答