111,092
社区成员




string[] arr = { "视频", "试听" };
Array.Sort(arr);
var zhCN拼音 = new CultureInfo(0x00804);// zhCN拼音.CompareInfo 等于 zh-CN
var zhCN笔划 = new CultureInfo(0x20804);// zhCN笔划.CompareInfo 等于 zh-CN_stroke
var strings = new [] { "一", "二" };
foreach (var culture in new[] { zhCN拼音, zhCN笔划 })
{
CultureInfo.CurrentCulture = culture;
Array.Sort(strings);
Console.WriteLine(string.Join(",", strings));
// 输出
// 二,一
// 一,二
}
// i = 1, 说明:‘视’ 大于 '试'
var i = string.Compare("视", "试", new CultureInfo("zh-CN"), CompareOptions.None);
下面实验,按第一个字分组的效果很明显,虽然第一个字的拼音是一样的。
CultureInfo.CurrentCulture = new CultureInfo("zh-CN");
string[] arr;
arr = new[] { "倚", "一", "衣" };
Array.Sort(arr);
Console.WriteLine(string.Join(",", arr)); // 输出:一,衣,倚
arr = new[] { "阿", "包"};
Array.Sort(arr);
Console.WriteLine(string.Join(",", arr)); // 输出:阿,包
arr = new[] { "倚阿", "倚包", "一阿", "一包", "衣阿", "衣包" };
Array.Sort(arr);
Console.WriteLine(string.Join(",", arr)); // 输出:一阿,一包,衣阿,衣包,倚阿,倚包
如果自己写,要自己判断是否不同字符的拼音一样,如果一样,接着判断随后字符。但是,
中文有多音字,要完全非常准确的判断,需要上下文知识,需要很好的‘人工’智能。
// 多音字词组例子,如果要准确的吧cang'ni排zang'ao在前面,就需要利用上下文来确认汉字的拼音。否则ao排在ni前面。
arr = new[] { "藏匿", "藏獒" };
Array.Sort(arr);
Console.WriteLine(string.Join(",", arr)); // 输出:藏獒,藏匿string[] arr = { "视频", "试听", "视图", "使用" };
string[] arr1 = new string[arr.Length];
for (int i = arr.GetLowerBound(0); i <= arr.GetUpperBound(0); i++)
//Console.WriteLine("[{0}]:\t{1}", i, arr.GetValue(i));
arr1[i] = arr.GetValue(i).ToString();
Console.ReadLine();
另外说一下:
Array.Sort会因为比较器是Null或者 Default,
而内部调用 TrySZSort。我是不知道这个API的具体实现是什么样。
其他的比较器貌似也达不到你的要求。
var zhCN拼音 = new CultureInfo(0x00804);// zhCN拼音.CompareInfo 等于 zh-CN
var zhCN笔划 = new CultureInfo(0x20804);// zhCN笔划.CompareInfo 等于 zh-CN_stroke
var strings = new [] { "一", "二" };
foreach (var culture in new[] { zhCN拼音, zhCN笔划 })
{
CultureInfo.CurrentCulture = culture;
Array.Sort(strings);
Console.WriteLine(string.Join(",", strings));
// 输出
// 二,一
// 一,二
}
[/quote]
单单从源码上来说,Array.Sort(arr)和Array.Sort<T>(arr)的重载并没有传入Comparer。
而是一个null值。
不过内部的TrySZSort有没有操作,我不得而知。
只能说,光从结果上来看,的确和Array.Sort(arr, StringComparer.CurrentCulture)一样。