相交扩展方法,区分大小写不起作用

时间:2010-01-18 16:00:16

标签: vb.net extension-methods

我试图使用MSTEST比较.NET中单元测试中2个集合的内容。为了简单起见,不必使用.Sort()然后遍历集合并一次比较一个项目,我发现了新的非常酷的.Intersect扩展方法。

通过这样做似乎很有效:

         Assert.AreEqual(expected.Count, actual.Intersect(expected).Count)

但是,现在我有一个需要区分大小写的测试,它会中断。我试过发送Intersect的第二个参数StringComparer.Ordinal,StringComparer.InvariantCulture和StringComparer.CurrentCulture ...没有运气..

以前有人经历过这个吗?

谢谢!

编辑:这是数据:

 Actual:
    (0) "FOO"   String
    (1) "foo"   String
    (2) "Foo"   String
    (3) "fOo"   String
    (4) "foO"   String
    (5) "BAR"   String
    (6) "BAR"   String
    (7) "BAZ"   String
    (8) "baz"   String
    (9) "foo"   String

 Expected:

    (0) "FOO"   String
    (1) "foo"   String
    (2) "Foo"   String
    (3) "fOo"   String
    (4) "foO"   String
    (5) "BAR"   String
    (6) "BAR"   String
    (7) "BAZ"   String
    (8) "baz"   String
    (9) "foo"   String

 actual.Intersect(expected, StringComparer.CurrentCulture)

    (0) "FOO"   String
    (1) "foo"   String
    (2) "Foo"   String
    (3) "fOo"   String
    (4) "foO"   String
    (5) "BAR"   String
    (6) "BAZ"   String
    (7) "baz"   String

它似乎正在删除匹配的副本'foo',以及匹配的重复'BAZ'。也许有一种更好的方法来断言集合是否匹配?

_EDIT2:我认为Intersect()会删除重复项,这就是为什么它会破坏。我找到了CollectionAssert类。这正是我所需要的!谢谢! _

2 个答案:

答案 0 :(得分:2)

出于测试目的,请使用CollectionAssert.AreEqual(actual, expected)

您正在寻找SequenceEqual,而不是Intersect。 Intersect返回两个序列的交集,即。他们之间共享的项目。在{1,2,3}和{3,4,5}上使用Intersect将返回3. SequenceEqual将返回false。

如果你没找到可以使用的CollectionAssert:

Assert.IsTrue(actual.SequenceEqual(expected))

答案 1 :(得分:1)

实现IEqualityComparer,如下所示:

Class StringCaseInsensitiveComparer
    Implements IEqualityComparer(Of String)
    Public Function Equals(ByVal s1 As String, ByVal s2 As String) As Boolean
        Return s1.ToLower() = s2.ToLower()
    End Function
    Public Function GetHashCode(ByVal s As String) As Integer
        Return s.GetHashCode()
    End Function
End Class

然后,调用相交的重载:

Dim first As IEnumerable(Of TSource)
Dim second As IEnumerable(Of TSource)
Dim comparer As IEqualityComparer(Of TSource)
Dim returnValue As IEnumerable(Of TSource)

传递你刚刚制作的比较器实例。