C# 如何按字母顺序对字符数组进行排序,以便同一字母的大写和小写版本彼此相邻?
比如说 输入数组:“a”、“b”、“b”、“a” 使用Array.Sort()输出:“A”、“B”、“A”、“B” 所需输出:“A”、“A”、“B”、“B” 我理解为什么“A”被认为比“A”低,但我希望它按字母顺序排序,而不是按字符的相应整数排序 是否有比较器类作为Array.Sort()的第二个参数来解决此问题 是否有比较器类作为Array.Sort()的第二个参数来解决此问题 对于字符串,您希望使用OrdinalIgnoreCase或InvariantCultureIgnoreCase,这取决于您是否关心区域性敏感度。见: 对于chars,我不知道有什么内置的比较器可以做到这一点,但是编写自己的比较器很容易。看 请注意,C# 如何按字母顺序对字符数组进行排序,以便同一字母的大写和小写版本彼此相邻?,c#,arrays,sorting,C#,Arrays,Sorting,比如说 输入数组:“a”、“b”、“b”、“a” 使用Array.Sort()输出:“A”、“B”、“A”、“B” 所需输出:“A”、“A”、“B”、“B” 我理解为什么“A”被认为比“A”低,但我希望它按字母顺序排序,而不是按字符的相应整数排序 是否有比较器类作为Array.Sort()的第二个参数来解决此问题 是否有比较器类作为Array.Sort()的第二个参数来解决此问题 对于字符串,您希望使用OrdinalIgnoreCase或InvariantCultureIgnoreCase,这取
Array.Sort
是一种变异排序;如果需要非变异排序,则在ToUpper
或ToUpper
上执行OrderBy
。注意这里有陷阱;看
还要注意的是,不清楚您的意图是否是A
和A
相等——在这种情况下A
,A
,A
将是一个合法的顺序,因为相等的事物是相等的,或者您是否仍然希望A
和A
中的顺序。同样,要小心。如果这是您想要的,那么您还必须执行然后执行
是否有比较器类作为Array.Sort()的第二个参数来解决此问题
对于字符串,您希望使用OrdinalIgnoreCase或InvariantCultureIgnoreCase,这取决于您是否关心区域性敏感度。见:
对于chars,我不知道有什么内置的比较器可以做到这一点,但是编写自己的比较器很容易。看
请注意,Array.Sort
是一种变异排序;如果需要非变异排序,则在ToUpper
或ToUpper
上执行OrderBy
。注意这里有陷阱;看
还要注意的是,不清楚您的意图是否是A
和A
相等——在这种情况下A
,A
,A
将是一个合法的顺序,因为相等的事物是相等的,或者您是否仍然希望A
和A
中的顺序。同样,要小心。如果这是您想要的,那么您还必须执行然后执行。您可以使用LINQ以正确的顺序创建一个新的字符数组:
var ans = chars.OrderBy(Char.ToUpper).ThenBy(c => c).ToArray();
您可以使用LINQ以正确的顺序创建一个新的char
数组
:
var ans = chars.OrderBy(Char.ToUpper).ThenBy(c => c).ToArray();
它们是char
元素还是单个字符串?它们是char元素,声明如下:char[]charArray={'a','b','b','a'};这个问题有点不明确。显然,您希望A
和A
都小于B
和B
,但不清楚A
在您的概念中是否小于、大于或等于A
。它们是char
元素还是单个字符串?它们是char元素,声明如下:char[/charArray={'a','b','b','a'};这个问题有点不够明确。很明显,你希望a
和a
都小于b
和b
,但在你的概念中a
小于、大于或等于a
还不清楚。你能解释一下为什么要这样做吗c.ToString().ToUpper()
分配一个新字符串,而不是char.ToUpper(c)
,后者不分配?我还注意到,您可以完全消除第一个lambda:chars.OrderBy(char.ToUpper)…
@EricLippert我忘记了Char.ToUpper
-对我来说这似乎是一个遗留代码,我希望一切都是一个方法/扩展方法流畅的风格。更新了我的答案。你能解释一下为什么你要做c.ToString().ToUpper()
,它分配一个新字符串,而不是Char.ToUpper(c)
,哪个没有?我还注意到,您可以完全消除第一个lambda:chars.OrderBy(char.ToUpper)…
@EricLippert我忘了Char.ToUpper
-对我来说这似乎是一个遗留代码,我希望一切都是一个方法/扩展方法流畅的风格。更新了我的答案。几年后,但你是想链接回你正在回答的问题吗?@NetMage:哈!显然不是,但我不记得我写了什么文章d链接到。:)几年后,但你是想链接回你正在回答的问题吗?@NetMage:哈!嗯,显然不是,但我不记得我打算链接到哪篇文章。:)