String.Compare 與 String.CompareTo 是 C# 進行字串排序比較的核心方法。本文透過範例系統說明其回傳值語義、多載用法與最佳實踐。
| 回傳值 | 含義 |
|---|---|
< 0 | 第一個字串排序在第二個字串之前(較小) |
= 0 | 兩字串相等 |
> 0 | 第一個字串排序在第二個字串之後(較大) |
string s = "abc";
Console.WriteLine(String.Compare("abc", "abc")); // 0
Console.WriteLine(String.Compare("abc", "ab")); // 1 ("abc" > "ab")
Console.WriteLine(String.Compare("abc", "a")); // 1
Console.WriteLine(String.Compare("abc", "b")); // -1 ("abc" < "b")
// 實例方法 CompareTo
Console.WriteLine(s.CompareTo("abc")); // 0
Console.WriteLine(s.CompareTo("ab")); // 1
Console.WriteLine(s.CompareTo("a")); // 1
Console.WriteLine(s.CompareTo("b")); // -1
String.Compare("ABC", "abc", true) // 0 (忽略大小寫)
String.Compare("ABC", "abc", false) // 非 0 (區分大小寫)
// 等價於
String.Compare("ABC".ToUpper(), "abc".ToUpper()) // 0
using System.Globalization;
var ci = CultureInfo.GetCultureInfo("tr-TR"); // 土耳其語:i/İ 不同
String.Compare("I", "i", false, ci); // 非 0 (土耳其語區分)
String.Compare("I", "i", true, ci); // 0 (忽略大小寫)
String.Compare(strA, strB, StringComparison.Ordinal); // 二進位比較(快、區分大小寫)
String.Compare(strA, strB, StringComparison.OrdinalIgnoreCase); // 二進位忽略大小寫
String.Compare(strA, strB, StringComparison.CurrentCulture); // 當前文化特性排序規則
String.Compare(strA, strB, StringComparison.InvariantCulture); // 不變文化特性(持久化資料推薦)
String.Compare("abcdef", 0, "abcxyz", 0, 3); // 0 (比較前 3 字元)
String.Compare("abcdef", 2, "xyz", 0, 3); // 比較 "cde" vs "xyz"
| 特性 | CompareTo | String.Compare |
|---|---|---|
| 型別 | 實例方法 | 靜態方法 |
| Null 處理 | this 為 null 拋例外;參數 null 視為較小 | 雙 null 相等;單 null 視為較小 |
| 功能豐富度 | 基礎 | 支援文化特性、選項、部分比較 |
| 介面實作 | 實作 IComparable<T> | 獨立靜態方法 |
StringComparison.Ordinal 或 InvariantCulture,避免文化特性導致結果不一致。CurrentCulture 或 CurrentCultureIgnoreCase。Ordinal 最快(直接比較二進位),避免 ToUpper() 配置新字串。String.Compare 處理 null 更安全,優先選用。String.Compare 是功能完整的字串比較瑞士刀,支援文化特性、大小寫選項、部分比較;CompareTo 適合實作 IComparable 介面的簡單排序。明確指定 StringComparison 列舉是現代 C# 避免微妙 Bug 的關鍵習慣。