我有以下带有或多或少随机字符串的字符串列表:
List<string> list= new List<string>();
list.Add( "Apple" );
list.Add( "Bubble" );
list.Add( "Dino" );
list.Add( "Common" );
list.Sort();
list.Add( "Aalborg" );
list.Sort();
StringBuilder sb = new StringBuilder();
foreach ( string s in list) {
sb.Append( s + " -> ");
}
MessageBox.Show( sb.ToString() );
我得到了
Apple -> Bubble -> Common -> Dino -> Aalborg ->
而不是
Aalborg -> Apple -> Bubble -> Common -> Dino ->
正如我预期的那样
解决方案:
list.Sort(StringComparer.InvariantCultureIgnoreCase);
由于cultureinfo,Aa被读为Å答案 0 :(得分:5)
这很可能是语言环境问题,
尝试
list.Sort(StringComparer.InvariantCultureIgnoreCase);
比较
list.Sort(StringComparer.Create(new CultureInfo("da-dk"), false));
在第一种情况下,“Aa”被视为重复两次的英文字母“a”。在第二个例子中,“Aa”被视为丹麦语“Å”,这是字母表的最后一个字母。因此,由于某种原因,字符串比较必须是丹麦语,并且在此上下文中排序是正确的。
答案 1 :(得分:4)
与文化信息有关尝试:
List<string> list = new List<string>();
list.Add("Apple");
list.Add("Bubble");
list.Add("Dino");
list.Add("Common");
list.Add("Aalborg");
list.Sort(new CultureInfo("da-DK").CompareInfo.Compare);
Console.WriteLine(string.Join(",",list)); //As in question
list.Sort(new CultureInfo("en-US").CompareInfo.Compare);
Console.WriteLine(string.Join(",",list)); //As people expect
答案 2 :(得分:0)
这是CultureInfo问题(或功能)。
每个回答的人都会在代码前加上:
Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("da");
对于丹麦文化而言,你会得到与问题主题相同的奇怪结果。
在阅读@ feaster对原帖后的评论后,我找到了这个解决方案。
要避免此行为,请使用System.Globalization.CultureInfo.InvariantCulture。