【问题标题】:SortedList/SortedDictionary weird behaviorSortedList/SortedDictionary 奇怪的行为
【发布时间】:2013-10-22 15:19:11
【问题描述】:

谁能解释为什么这段代码:

Dim Data As New SortedList(StringComparer.InvariantCultureIgnoreCase)
Data.Add("AB", 48)
Data.Add("AC", 48)
Data.Add("A-D", 48)
Data.Add("A-", 48)

按以下顺序生成排序列表:

A-  
AB  
AC  
A-D

预期(合乎逻辑且真正想要的)顺序是:

A-
A-D
AB
AC

【问题讨论】:

    标签: c# .net vb.net sorting


    【解决方案1】:
    Dim Data As New SortedList(StringComparer.InvariantCultureIgnoreCase)
    

    我认为问题出在指定的排序规则上。

    InvariantCultureIgnoreCase 更改为OrdinalOrdinalIgnoreCase 即可解决问题

    Dim Data As New SortedList(StringComparer.OrdinalIgnoreCase)
    

    这里是Demo

    【讨论】:

    • 正确。不变的文化,就像 .NET 中的 otter 文化一样,首先去掉所有破折号-,然后查看哪个字符串更大。如果像这样找到更大的字符串,则返回该结果。否则,将考虑破折号。
    • @JeppeStigNielsen 为什么要特别注意连字符?
    【解决方案2】:

    这就是默认字符串比较器的实现方式。要自定义它,您必须实现自己的自定义 IComparer 或为了更好的兼容性覆盖 Comparer<T> 类并将其传递给 SortedList 构造函数或传递 StringComparer.OrdinalIgnoreCase

    【讨论】:

    • +1 InvariantCultureIgnoreCase 的具体实现试图以在所有文化中具有相同含义的方式进行排序。我冒昧地猜测非序数字母顺序的连字符被忽略了。
    【解决方案3】:

    您是在要求比较者以一种文化上冷漠的方式行事。这使用了本地化团队认为最合适的方法,以便不同文化中的消费者能够理解排序。

    这是无序的,因此并非所有字符都被自动考虑和排名。

    我冒昧地猜测,出于字母排序的目的,连字符被忽略(概念上连接单词)。

    您可能会建议“Ricky-Bobby”在“RickyBobby”之前出现,但本地化团队显然不同意。所有文化中的消费者都可能理解这两个条目之间的排序差异......并且,此外,理解为什么两者都排在“Ricky-Charlie”之前

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多