C# 如何按字母顺序对字符数组进行排序,以便同一字母的大写和小写版本彼此相邻?

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,这取

比如说

输入数组:“a”、“b”、“b”、“a”

使用Array.Sort()输出:“A”、“B”、“A”、“B”

所需输出:“A”、“A”、“B”、“B”

我理解为什么“A”被认为比“A”低,但我希望它按字母顺序排序,而不是按字符的相应整数排序

是否有比较器类作为Array.Sort()的第二个参数来解决此问题

是否有比较器类作为Array.Sort()的第二个参数来解决此问题

对于字符串,您希望使用OrdinalIgnoreCase或InvariantCultureIgnoreCase,这取决于您是否关心区域性敏感度。见:

对于chars,我不知道有什么内置的比较器可以做到这一点,但是编写自己的比较器很容易。看

请注意,
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:哈!嗯,显然不是,但我不记得我打算链接到哪篇文章。:)