【问题标题】:Easiest method to OrderBy a String using StringComparison.Ordinal使用 StringComparison.Ordinal 对字符串进行排序的最简单方法
【发布时间】:2015-04-22 16:57:29
【问题描述】:

我发现了一个由String.CompareTo 和二进制搜索导致的错误(在我的代码中),因为我的自定义 IComparer(用于包装类型)使用了String.Compare(x, y, StringComparison.Ordinal)

这是因为 items.OrderBy(i => i.Name)(其中 Name 是字符串类型)用于构建要搜索的 Array 使用字符串对象本身作为 IComparable - 并且具有不同的规则:

比较使用当前文化来获取特定于文化的信息,例如大小写规则和单个字符的字母顺序。例如,文化可以指定某些字符组合被视为单个字符,或以特定方式比较大小写字符,或者字符的排序顺序取决于其前面或后面的字符。

例如,{A, b, C} 使用 OrderBy-using-Default-String-Compare 排序为 [A, b, C],但根据 Ordinal 比较应该是 [b, A, C] - 因为不是,所以二进制搜索是失败。

现在,把“上下文”排除在外,

使用与String.Compare(.., StringComparison.Ordinal) 相同的字符串属性对对象进行排序的最简单(例如,不为字符串实现自定义 IComparer)方法是什么?


编辑:我 [刚刚意识到我] 可以而且可能应该只使用 OrderBy(x => x, theSameComparer) - 但假设这是不可能的,如何使用 OrderBy 来获得相同的结果?

【问题讨论】:

    标签: c# string compare ienumerable ordinal


    【解决方案1】:

    有一个预建的StringComparer 应用StringComparison.Ordinal - 那是StringComparer.Ordinal

    items.OrderBy(i => i.Name, StringComparer.Ordinal)
    

    【讨论】:

    • 啊,太棒了(或者让我看起来很无聊):我认为 StringComparer.Ordinal 是一个常数 - 应该意识到它本身就是一个比较器。
    • 啊,该刷新页面了。你打败了我。
    【解决方案2】:

    您应该可以将StringComparer.Ordinal 直接添加到您的OrderBy 中。

    string[] content = { "A", "b", "C", "d", "AB", "Ab" };
    var ordered = content.OrderBy(o => o, StringComparer.Ordinal);
    

    然后,一旦您遍历ordered,您将收到以下输出:

    // Output:
    A
    AB
    Ab
    C
    b
    d
    

    我相信这就是你所追求的。

    【讨论】:

      【解决方案3】:

      值得一提的是,它不仅可以用于Linq,还可以用于ArrayList排序:

      string[] content = { "A", "b", "C", "d", "AB", "Ab" };
      Array.Sort(content);
      //output: A,Ab,AB,b,C,d
      Array.Sort(content, StringComparer.Ordinal);
      //output: A,AB,Ab,C,b,d
      
      var list = new List<string>{ "A", "b", "C", "d", "AB", "Ab" };
      list.Sort(StringComparer.Ordinal);
      //output: the same as array.srot and linq with Ordinal comparer
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-03
        • 2011-12-09
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 2010-09-12
        相关资源
        最近更新 更多