【问题标题】:How to sort an array of chars alphabetically so that the uppercase and the lowercase version of the same letter are next to each other?如何按字母顺序对字符数组进行排序,以使同一字母的大写和小写版本彼此相邻?
【发布时间】:2019-03-09 04:04:14
【问题描述】:

例如

输入数组:'a', 'b', 'B', 'A'

使用 Array.Sort() 输出:'A'、'B'、'a'、'b'

所需的输出:'A'、'a'、'B'、'b'

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

是否有一个 Comparer 类可以作为 Array.Sort() 的第二个参数来解决问题?

【问题讨论】:

  • 它们是char 元素,还是单个字符串?
  • 它们是 char 元素,声明如下: char [] charArray = { 'a', 'b', 'B', 'A' };
  • 这个问题的说明有些不足。很明显,您希望Aa 都小于Bb,但不清楚a 在您的概念中是否小于、大于或等于A

标签: c# arrays sorting


【解决方案1】:

是否有一个 Comparer 类可以作为 Array.Sort() 的第二个参数来解决问题?

对于字符串,您希望使用 OrdinalIgnoreCase 或 InvariantCultureIgnoreCase,具体取决于您是否关心文化敏感性。见:

Which is generally best to use -- StringComparison.OrdinalIgnoreCase or StringComparison.InvariantCultureIgnoreCase?

对于字符,我不知道有什么内置的比较器可以做到这一点,但你自己编写比较容易。见

What is the correct way to compare char ignoring case?

注意Array.Sort 是一种变异排序;如果你想要一个非变异排序,那么在ToUpperToUpperInvariant 上执行OrderBy。请注意,这里有陷阱;见

How to sort an array of chars alphabetically so that the uppercase and the lowercase version of the same letter are next to each other?

另请注意,不清楚您的意图是否是 Aa 相等 -- 在这种情况下,AaA 将是合法的排序,因为平等的事物是平等的,或者您是否仍然想要在aA 中进行排序。再次,要小心。如果这就是你想要的,那么你也必须做一个ThenBy

【讨论】:

  • 晚了几年,但您的意思是链接回您正在回答的问题吗?
  • @NetMage:哈!呃,显然不是,但我不记得我打算链接到哪篇文章。 :)
【解决方案2】:

您可以使用 LINQ 以正确的顺序创建一个新的char Array

var ans = chars.OrderBy(Char.ToUpper).ThenBy(c => c).ToArray();

【讨论】:

  • 你能解释一下为什么你在做c.ToString().ToUpper(),它分配一个新的字符串,而不是char.ToUpper(c),它没有?
  • 我还注意到您可以完全消除第一个 lambda:chars.OrderBy(char.ToUpper)...
  • @EricLippert 我忘记了Char.ToUpper - 这对我来说似乎是遗留代码,我希望一切都是一种方法/扩展方法流利的风格。更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 2018-12-14
相关资源
最近更新 更多