public void DictionarySort(ref List<string> fpeList)
{
string temp;
for (int i = 0; i < fpeList.Count; i++)
{
for (int j = i + 1; j < fpeList.Count; j++)
{
if (CompareChineseString(fpeList[i].ToString(), fpeList[j].ToString()) > 0)
{
temp = fpeList[i];
fpeList[i] = fpeList[j];
fpeList[j] = temp;
}
}
}
} //比较两个中文 符串的首字母
//小于零 string1 小于 string2。
//零 string1 等于 string2。
//大于零 string1 大于 string2。
private int CompareChineseString(string string1, string string2)
{
char[] string1List = string1.ToCharArray();
char[] string2List = string2.ToCharArray();
string compareString1 = string.Empty;
string compareString2 = string.Empty;
for (int i = 0; i < string1List.Length; i++)
{
compareString1 += GetSpell(string1List[i].ToString());
}
for (int i = 0; i < string2List.Length; i++)
{
compareString2 += GetSpell(string2List[i].ToString());
}
int resualt = string.Compare(compareString1, compareString2, true);
return resualt;
}
//获取中文字符首字母
private string GetSpell(string cnChar)
{
byte[] arrCN = Encoding.Default.GetBytes(cnChar);
if (arrCN.Length > 1)
{
int area = (short)arrCN[0];
int pos = (short)arrCN[1];
int code = (area << 8) + pos;
int[] areacode = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };
for (int i = 0; i < 26; i++)
{
int max = 55290;
if (i != 25)
{
max = areacode[i + 1];
}
if (areacode[i] <= code && code < max)
{
return Encoding.Default.GetString(new byte[] { (byte)(65 + i) });
}
}
return "Z";
}
else return cnChar;
}
其中多音字首字母的识别还在寻找方法。不过一些程序中要特殊处理的多音字,在程序中处理一下就够了。