代码之家  ›  专栏  ›  技术社区  ›  dferraro

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

  •  1
  • dferraro  · 技术社区  · 15 年前

    我尝试使用mstest比较.NET中一个单元测试中两个集合的内容。为了使事情简单化,我不再需要.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 回复  |  直到 15 年前
        1
  •  2
  •   Ahmad Mageed    15 年前

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

    你在找 SequenceEqual 不是 Intersect .intersect返回两个序列的交集,即它们之间共享的项。使用intersect on 1、2、3和3、4、5将返回3。SequenceEqual将返回false。

    如果你没有找到收藏,你就不能使用:

    Assert.IsTrue(actual.SequenceEqual(expected))
    
        2
  •  1
  •   Brett Widmeier    15 年前

    实现这样的IEqualityComparer:

    <代码> 类StringcaseInsensitiveComparer
    __implements iequalityComparer(of string)
    α 公共函数等于(byval s1作为字符串,byval s2作为字符串)as boolean
    ____return s1.tolower()=s2.tolower()
    __end function
    α 公共函数gethashcode(byval s as string)as integer
    ____return s.gethashcode()
    __end function
    结束类 < /代码>

    然后,调用intersect的重载:

    dim first as ienumerable(of tsource)
    dim second as ienumerable(of tsource)
    dim comparer as iequalitycomparer(of tsource)
    将返回值变为IEnumerable(源的) < /代码>

    将您刚创建的比较器的实例传递给它。

    S.GethasoCo()
    __结束功能
    端类

    然后,调用intersect的重载:

    作为IEnumerable(源)的Dim First
    (源的)作为IEnumerable的dim second
    Dim比较器(来源)
    将返回值变为IEnumerable(源的)

    传递给它一个您刚刚创建的比较器实例。