首页 > 解决方案 > 按字母顺序排列,Array.Sort() 效果不佳

问题描述

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

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

// Output: ABCabc
// I need: AaBbCc

有任何想法吗?

标签: c#.net

解决方案


您可以使用 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);

推荐阅读