2010-01-18 80 views
1

我想在.NET中使用MSTEST在單元測試中比較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 

好像被刪除匹配複製「富」,並匹配重複的「BAZ」。也許有更好的方式來斷言集合是否匹配?

_EDIT2:我認爲Intersect()刪除重複項,這就是爲什麼這是打破。我找到了CollectionAssert類。這正是我需要的!謝謝! _

+0

當你說「它打破了」和「沒有運氣」,你是什麼意思?你的意思是「它打破了」,如「它給出了錯誤的計數」?你的意思是「沒有運氣」,如「它給出了同樣的錯誤結果」? –

+0

此外,您是否確定不區分大小寫的工作是正確的,並且不只是巧合地給出正確的計數? –

+1

此外,您可能想要查看CollectionAssert類,這可能更適合您嘗試執行的操作。 –

回答

2

出於測試目的使用CollectionAssert.AreEqual(actual, expected)

你要找的SequenceEqual,不Intersect。相交返回兩個序列的交集,即。他們之間共享的項目。在{1,2,3}和{3,4,5}上使用交集將返回3. SequenceEqual將返回false。

如果你不是找到CollectionAssert你可能已經使用:

Assert.IsTrue(actual.SequenceEqual(expected)) 
+1

感謝您的回覆。我看過你發佈的MSDN文檔..有一點需要注意,SequenceEqual似乎比較引用...不是實際值......所以我認爲SequenceEqual在沒有實現IComparable的情況下仍然會失敗。不過很高興知道!再次感謝 – dferraro

+0

@dferraro np ...對於字符串或整數等的集合,您可以直接使用它,默認的相等比較器用於給定類型的值。對於自定義類,它需要一個「IEqualityComparer」來確定如何比較對象。 –

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)

通過它,你剛纔提出的比較器的一個實例。

+0

謝謝 - 我想通了我應該使用CollectionAssert。但是回到最初的問題 - InvariantCulture和CurrentCulture比較器不應該完全按照你在這裏做的事情嗎?他們在文檔中說'是否區分大小寫比較'。 – dferraro

+0

對不起,請嘗試使用StringComparer。InvariantCultureIgnoreCase,StringComparer.OrdinalIgnoreCase或StringComparer.CurrentCultureIgnoreCase。 –

+0

我意識到問題不在區分大小寫 - 如果你看看上面的數據,似乎intersect()會過濾出重複項。這是問題 – dferraro