SortedList / SortedDictionary奇怪的行为

时间:2013-10-14 23:11:59

标签: c# .net vb.net sorting

任何人都可以解释为什么这段代码:

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

3 个答案:

答案 0 :(得分:4)

Dim Data As New SortedList(StringComparer.InvariantCultureIgnoreCase)

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

InvariantCultureIgnoreCase更改为OrdinalOrdinalIgnoreCase可解决问题

Dim Data As New SortedList(StringComparer.OrdinalIgnoreCase)

以下是Demo

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

我冒昧地猜测连字符被忽略(概念上连接单词)以便进行字母排序。

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