我对字母顺序有疑问。 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/