c# - 按字母顺序排列,Array.Sort() 效果不佳
问题描述
我对字母顺序有疑问。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);
推荐阅读
- apache - 我想更改 Apache 服务器上的 Cache-Control
- eloquent - 具有多个选择选项的过滤器
- powershell - 在 azure devops CI 管道中使用 Run PsScriptanalyzer
- r - 根据 if + else if + else 改变值
- python - 在 Pandas DataFrame 中将天数转换为年数
- r - 用非 nlme 包模型绘制半变异函数
- regex - Google Apps 脚本表单 textValidationBuilder 无法识别正则表达式模式
- azure - Azure API for FHIR 使用 Generate Id 创建新资源
- javascript - 浏览器前后按钮无法正常工作
- html - 显示 flex 没有正确对齐