2013-10-14 61 views
4

任何人能解釋爲什麼這代碼:排序列表/ SortedDictionary怪異的行爲

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
Dim Data As New SortedList(StringComparer.InvariantCultureIgnoreCase) 

我認爲這個問題是與指定的排序規則。

更改InvariantCultureIgnoreCaseOrdinalOrdinalIgnoreCase解決問題

Dim Data As New SortedList(StringComparer.OrdinalIgnoreCase) 

這裏是Demo

+0

正確。不變的文化,就像.NET中的水獺文化一樣,首先將所有的破折號去掉,看看哪一個字符串大於那個。如果發現更大的字符串,返回該結果。否則,將考慮破折號。 –

+0

@JeppeStigNielsen爲什麼這種特殊照顧連字符? –

3

這就是如何實現默認字符串比較器。要定製這個,你必須實現你自己定製的IComparer或者爲了更好的兼容性覆蓋Comparer<T>類,並把它傳遞給SortedList構造函數或者傳遞StringComparer.OrdinalIgnoreCase

+1

+1 InvariantCultureIgnoreCase的具體實現嘗試的方式進行排序,其*在所有文化中具有相同的含義*。我試圖猜測,無序序列字母化的連字符會被忽略。 – Matthew

1

你問的比較器在文化冷漠的方式行事。這使用了本地化團隊認爲是最合適的方法,讓不同文化的消費者理解排序。

這是非序數,所以並非所有的字符都是自動考慮和排名。

爲了字母排序的目的,我會冒險猜測連字符被忽略(概念上連接詞)。

您可能會建議「Ricky-Bobby」出現在「RickyBobby」之前,但本地化團隊顯然不同意。在所有文化中消費者可能會理解排序冷漠這兩個條目之間......,而且,明白了爲什麼「瑞奇 - 查理」來之前