2008-11-05 97 views
3

我有一個應用程序使用string.compare(string,string)對一些值進行排序。我無法弄清楚的是,爲什麼「1022」比較小於「10-23」和「10-23」比較小於「1024」。這些比較應該返回什麼?

是否有特定於導致此結果的「 - 」的值?對於相同類型的數據(帶有破折號的數字),string.compare的重載是否會針對不同的區域設置給出相同的結果?

回答

5

string.Compare(String, String)文檔:

的比較是使用單詞排序規則來執行。

further

.NET框架使用排序的三種不同的方式:字排序,字符串排序,並依次排序。字排序對字符串進行文化敏感的比較。某些非字母數字字符可能具有分配給它們的特殊權重。例如,連字符(「 - 」)可能會有一個非常小的權重,因此「coop」和「co-op」會在排序列表中相鄰顯示。字符串排序與字詞排序類似,只是沒有特殊情況。因此,所有非字母數字符號都出現在所有字母數字字符之前。序號排序根據字符串的每個元素的Unicode值來比較字符串。

Michael Kaplan的更多詳情:A&P of Sort Keys, part 9 (aka Not always transitive, but punctual and punctuating)

3

那麼,忽略破折號是相當無辜的。如果你想包括它們,也​​許在過載中使用StringComparison.Ordinal

docs for string.Compare,它使用單詞排序規則,這從here意味着:

單詞排序執行字符串的培養敏感 比較。某些 非字母數字字符可能有 分配給它們的特殊權重。例如,對於 示例,連字符(「 - 」)可能會有一個分配給它的非常小的權重,因此 「排序」和「合作」會在 旁邊出現在排序列表中。

至少它是傳遞的:我登錄與「連接」的東西非常相似,涉及破折號bug - 其中A < B,B <Çç< A.因爲非過渡比較基本符排序規則。它被關閉「不會修復」。那就是:

string s1 = "-0.67:-0.33:0.33"; 
string s2 = "0.67:-0.33:0.33"; 
string s3 = "-0.67:0.33:-0.33"; 
Console.WriteLine(s1.CompareTo(s2)); 
Console.WriteLine(s2.CompareTo(s3)); 
Console.WriteLine(s1.CompareTo(s3)); 

(返回1,1,-1我的機器上)

相關問題