【问题标题】:How does OrderBy work with regard to strings in C#?OrderBy 如何处理 C# 中的字符串?
【发布时间】:2014-03-28 06:18:22
【问题描述】:

考虑这段代码

var strings2 = new List<string>
    {
        "0", // Ascii code 48 (decimal)
        "|"  // Ascii code 125 (decimal)
    };
var sorted = strings2.OrderBy(x => x).ToArray();

已排序包含"|", "0"。现在考虑这段代码(我所做的只是将"|" 更改为"."

var strings2 = new List<string>
    {
        "0", // Ascii code 48 (decimal)
        "."  // Ascii code 46 (decimal)
    };
var sorted = strings2.OrderBy(x => x).ToArray();

现在排序包含".", "0" 在这两种情况下,"0" 都出现在最后,即使 125 > 48,这里发生了什么?

【问题讨论】:

  • ASCII 数字代码不一定等同于字符串中字符的排序顺序。许多不同的因素会影响排序顺序,尤其是执行程序的当前文化。
  • 那么排序顺序是什么?
  • 我不是专家,但您使用的是字符串(由双引号 " 分隔)而不是字符(由单引号 ' 分隔)。正如@Sam 提到的,这可能与它有关。

标签: c# linq


【解决方案1】:

您使用的订单depends on the culture

您可以通过重载将文化传递给 OrderBy。

var sorted = strings2.OrderBy(x => x, StringComparer.InvariantCulture)

【讨论】:

    【解决方案2】:

    给你:

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

    Source: String.Compare Method on MSDN

    【讨论】:

      【解决方案3】:

      “.OrderBy”函数使用字符串的默认比较器。该比较器不一定会返回基于 ASCII 码的排序顺序。

      有关所有不同字符串比较器的列表,请参阅MSDN 上的文章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多