排序列表/排序词典 奇怪的行为
本文关键字:排序 列表 | 更新日期: 2023-09-27 18:35:15
谁能解释为什么这段代码:
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
Dim Data As New SortedList(StringComparer.InvariantCultureIgnoreCase)
我认为问题出在指定的排序规则上。
将InvariantCultureIgnoreCase
更改为Ordinal
或OrdinalIgnoreCase
可解决问题
Dim Data As New SortedList(StringComparer.OrdinalIgnoreCase)
这是演示
这就是默认字符串比较器的实现方式。要自定义它,您必须实现自己的自定义IComparer
或为了更好的兼容性Comparer<T>
覆盖类并将其传递给构造函数或传递StringComparer.OrdinalIgnoreCase
SortedList
。
你要求比较者以一种文化上漠不关心的方式行事。这使用了本地化团队认为最合适的方法,以便不同文化的消费者能够理解排序。
这是非序数的,因此并非所有字符都会自动考虑和排名。
我冒昧地猜测,为了字母排序的目的,连字符被忽略了(概念上连接单词)。
你可能会建议"Ricky-Bobby"排在"RickyBobby"之前,但本地化团队显然不同意。所有文化的消费者都可能理解这两个条目之间的排序差异......并且,此外,了解为什么两者都在"瑞奇-查理"之前