4

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

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
4

3 回答 3

4
Dim Data As New SortedList(StringComparer.InvariantCultureIgnoreCase)

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

改变或InvariantCultureIgnoreCase解决问题OrdinalOrdinalIgnoreCase

Dim Data As New SortedList(StringComparer.OrdinalIgnoreCase)

这是演示

于 2013-10-14T23:47:02.100 回答
3

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

于 2013-10-14T23:36:46.860 回答
1

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

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

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

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

于 2013-10-15T00:18:43.037 回答