0

我有以下带有或多或少随机字符串的字符串列表:

    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);

由于文化信息,Aa 被读取为 Å

4

3 回答 3

5

这很可能是语言环境问题,

尝试

list.Sort(StringComparer.InvariantCultureIgnoreCase);

相比

list.Sort(StringComparer.Create(new CultureInfo("da-dk"), false));

在第一种情况下,“Aa”被视为重复两次的英文字母“a”。在第二个示例中,“Aa”被视为丹麦语“Å”,它是字母表的最后一个字母。因此,由于某种原因,您的字符串比较必须是丹麦语,并且在这种情况下排序是正确的。

于 2013-08-27T12:13:32.943 回答
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
于 2013-08-27T12:18:47.990 回答
0

这是一个 CultureInfo 问题(或功能)。

每个回答的人,在你的代码前面加上:

Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("da");

对于丹麦文化,您将得到与问题作者相同的奇怪结果。

在阅读@feaster 对原始帖子的评论后,我找到了这个解决方案。

要避免这种行为,请使用 System.Globalization.CultureInfo.InvariantCulture。

于 2013-08-27T12:20:24.953 回答