LINQ OrderBy 忽略大小写,采用真正的 ASCII 排序

问题描述 投票:0回答:2

我尝试在 C# 中使用 LINQ 按 ASCII 顺序对字符串(“A”、“_”、“a”)进行排序,同时忽略大小写。根据ASCII表,我感兴趣的字符串是:

  • A = 65
  • _ = 95
  • a = 97

所以我期望输出是

一个,_,一个

但是我尝试了所有 StringComparer 变体,但它们都没有给我所需的输出。以下是我的测试程序和输出:

    string[] words = { "A", "_", "a" };
    
    var sortedWords = words.OrderBy(a => a, StringComparer.OrdinalIgnoreCase);
    Console.WriteLine("OrdinalIgnoreCase: " + string.Join(", ", sortedWords));

    sortedWords = words.OrderBy(a => a, StringComparer.CurrentCultureIgnoreCase);
    Console.WriteLine("CurrentCultureIgnoreCase: " + string.Join(", ", sortedWords));

    sortedWords = words.OrderBy(a => a, StringComparer.InvariantCultureIgnoreCase);
    Console.WriteLine("InvariantCultureIgnoreCase: " + string.Join(", ", sortedWords));

输出:

序号忽略大小写:A、a、_

当前文化忽略大小写:_、A、a

InvariantCulture忽略大小写:_、A、a

.net 小提琴在这里。

如何根据 ASCII 顺序对数组进行排序以获得“A, _, a”?

c# .net linq sorting ascii
2个回答
15
投票

使用

StringComparer.Ordinal
....通过使用
StringComparer.OrdinalIgnoreCase
你会忽略大小写,所以它可能会默默地将所有内容转换为大写。

来自 MSDN:

序数忽略大小写

OrdinalIgnoreCase 属性返回的 StringComparer 将要比较的字符串中的字符视为使用不变区域性的约定转换为大写字母,然后执行与语言无关的简单字节比较。

序数

Ordinal 属性返回的 StringComparer 执行与语言无关的简单字节比较。

样本格式正确:

http://ideone.com/0YTUdr


0
投票
words.OrderBy(w=>w, new CaseInsensitiveCompare());

© www.soinside.com 2019 - 2024. All rights reserved.