您可以通过使用能理解一个比较器如何比较排序字符解决这个问题字母按字母顺序排列(默认为序号比较)。
这个实现是非常低效的,因为它转换字符为字符串每次做一个比较的时间,但它的工作原理:
public class CharComparer : IComparer<char>
{
readonly CultureInfo culture;
public CharComparer(CultureInfo culture)
{
this.culture = culture;
}
public int Compare(char x, char y)
{
return string.Compare(new string(x, 1), 0, new string(y, 1), 0, 1, false, culture);
}
}
(注:文化是没有实际必要在这里;它的工作原理没有它。我只是包括它的完整性)
然后你就可以使用与接受IComparer
排序功能,如Array.Sort()
:
static void Main()
{
var test = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ".ToCharArray();
Console.OutputEncoding = System.Text.Encoding.Unicode;
Array.Sort(test);
Console.WriteLine(new string(test)); // Wrong result using default char comparer.
Array.Sort(test, new CharComparer(CultureInfo.GetCultureInfo("lt"))); // Right result using string comparer.
Console.WriteLine(new string(test));
}
另一种方法是使用单字符字符串数组而不是字符数组,然后对其进行排序。这工作,因为排序功能将使用字符串比较器,其理解字母顺序:
var test = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ".Select(x => new string(x, 1)).ToArray();
Console.OutputEncoding = System.Text.Encoding.Unicode;
Array.Sort(test); // Correct result because it uses the string comparer, which understands alphabetical order.
Console.WriteLine(string.Concat(test));
或者使用LINQ:
var test = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ".Select(x => new string(x, 1)).ToArray();
Console.OutputEncoding = System.Text.Encoding.Unicode;
// Correct result because it uses the string comparer, which understands alphabetical order.
test = test.OrderBy(x => x).ToArray();
Console.WriteLine(string.Concat(test));
使用字符串代替字符数组的数组可能是更好的性能当这样排序时。
[查看Jeppe Stig Nielsen的评论](http://stackoverflow.com/a/34489023/3060520) –