c# - 按字母顺序排列,Array.Sort() 效果不佳

标签 c# .net

我对字母顺序有疑问。 Array.Sort() 在我的情况下效果不佳。

string str = "AaBbCc";
char[] arr = second.ToCharArray();
Array.Sort(arr);

// Output: ABCabc
// I need: AaBbCc

有什么想法吗?

最佳答案

您可以使用 LINQ 实现您想要的。

首先,我们需要将您的字符分解为一系列单个字符串。我们可以用 select 做到这一点。

str.Select(x => x.ToString())

好的,现在我们要对这个列表进行排序。字符串的默认排序是单词排序,它会将其排序为 aAbBcC .由于您想先获得首都,我们将使用 OrdinalIgnoreCase比较器,它将我们的字符分组。

   .OrderBy(x => x, StringComparer.OrdinalIgnoreCase)

好的,现在我们已经对角色进行了分组。我们现在要使用 ThenBy 按顺序对这些组进行排序,以使大写字母排在第一位。

   .ThenBy(x => x, StringComparer.Ordinal)

最后,我们可以把它变成一个数组。

   .ToArray();

把它放在一起,我们得到以下内容:

var res = str.Select(x => x.ToString())
             .OrderBy(x => x, StringComparer.OrdinalIgnoreCase)
             .ThenBy(x => x, StringComparer.Ordinal)
             .ToArray();

这给了我们一个如下所示的数组:["A","a","B","b","C","c"]

在这一点上,正如@dvo 所指出的,我们可以通过调用 String.Join 将其转回单个字符串,如下所示:

var resStr = string.Join("", res);

正如@RufusL 指出的那样,我们可以为这个查询做更多的事情。因为我们知道我们最终想要一个字符串,所以我们可以跳过 ToArray完全调用并坚持使用 IOrderedEnumerable<string> .

var res = str.Select(x => x.ToString())
             .OrderBy(x => x, StringComparer.OrdinalIgnoreCase)
             .ThenBy(x => x, StringComparer.Ordinal);

因为我们没有用字符串连接任何东西,我们可以使用 string.Concat而不是 string.Join .

var resStr = string.Concat(res);

关于c# - 按字母顺序排列,Array.Sort() 效果不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57716746/

相关文章:

c# - 如何自动隐藏表单

c# - 有趣的事件 "Dispose"行为

c# - 单点登录 - API 版本控制和共享数据传输对象

c# - 有必要杀掉这个问题的指令吗?

c# - 将 C++ map 数据传递给 C#

c# - 在代码中模拟一系列按钮点击并等待效果完成

c# - 如何从Azure表存储中查询最近的n条记录?

.net - SQL Server - XML 验证 : Invalid simple type value

c# - 如何对高于阈值的序列元素进行分组?

c# - 使用 MSBuild 在 Jenkins 中构建 .net 应用程序