C# 字串比較

  • 4010
  • 0
  • 2020-12-16
str1 = "HÀ HỮU TUYÊN";
str2 = "HÀ HỮU TUYÊN";

程式說這兩個字串不一樣,我一眼就看出 ... 看出這個問題我要找很久 …

故事先來一下:

DB存的是str1,使用者輸入的是str2
其實也沒有花很久時間,馬上想到是字串比對StringComparison的問題
原本用的是OrdinalIgnoreCase,但這串奇怪語言,我猜應該是要包含點什麼文化特性,試的結果如下:
 

str1 = "HÀ HỮU TUYÊN";
str2 = "HÀ HỮU TUYÊN";

Console.WriteLine($"InvariantCultureIgnoreCase : " + str1.Equals(str2, StringComparison.InvariantCultureIgnoreCase));
Console.WriteLine($"CurrentCultureIgnoreCase   : " + str1.Equals(str2, StringComparison.CurrentCultureIgnoreCase));
Console.WriteLine($"OrdinalIgnoreCase          : " + str1.Equals(str2, StringComparison.OrdinalIgnoreCase));
Console.WriteLine($"Equal                      : " + str1.Equals(str2));

https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/best-practices-strings

官方建議,大概總結一下

  1.     沒有文化特性(只有英文、符號)的比較可以用Ordinal,OrdinalIgnoreCase(效能也比較好)
  2.     有文化特性的(多語系)請用CurrentCulture
  3.     沒事不要用InvariantCulture
  4.     用string.Equals 最好指定 StringComparison,給明確的規則
  5.     string.Compare,string.CompareTo不要拿來檢查是否相等(官方寫的沒給理由,有空再找)