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
官方建議,大概總結一下
- 沒有文化特性(只有英文、符號)的比較可以用Ordinal,OrdinalIgnoreCase(效能也比較好)
- 有文化特性的(多語系)請用CurrentCulture
- 沒事不要用InvariantCulture
- 用string.Equals 最好指定 StringComparison,給明確的規則
- string.Compare,string.CompareTo不要拿來檢查是否相等(官方寫的沒給理由,有空再找)