C# 字串比較的幾種方式

在 C# 中主要有兩種比較方式, == 和 Equals

== 是用來比較兩個的記憶體位置是否相同,在 C# 中字串是不可變的(immutable),所有字串都會共用一個字串常數,所以比較結果都會相同。
在 C# 中所有物件都繼承 System.Object ,而 System.Object 中有 Equals 這個虛擬方法,所以所有物件都可以使用 Equals 來進行比較。通常我們使用 Equals 比較並不是為了驗證兩者的記憶體位置是否相等,而是想要確認內容是否相同,所以在建立自訂物件時通常都會覆寫 Equals 方法,讓我們可以比較兩者是否相同:
    
public class User
{
    public string Id { get; set; }
    public string Name { get; set; }

    public override bool Equals(object? obj)
    {
        if (obj is not User user) return false;
        return user.Id == this.Id && user.Name == this.Name;
    }
}
    

離題了,以字串來說在 C# 中 == 和 Equals 的比較結果都一樣。

不過本篇主要是因為筆者在逛 Microsoft.Learn 的時候意外的發現有 String.Equals 這個方法,並且還可以傳入 StringComparison。

以前筆者在比較需要在乎大小寫的字串時通常都會這樣比較:
    
string input = "ruyut";

if (input.ToUpper() == "Ruyut".ToUpper())
{
    Console.WriteLine("相等");
}
    

都會先把兩邊 ToUpper(或是 ToLower),先轉換成大寫再比較,但其實可以這樣做:
    
string input = "ruyut";

if (string.Equals(input, "Ruyut", StringComparison.OrdinalIgnoreCase))
{
    Console.WriteLine("相等");
}
    

或是:
    
string input = "ruyut";

if (input.Equals("Ruyut", StringComparison.OrdinalIgnoreCase))
{
    Console.WriteLine("相等");
}
    

兩個都是同樣用來比較「不區分大小寫」的字串比較,聽說使用 Ordinal 或是 OrdinalIgnoreCase 都是最快的,是依照二進位值來比較大小,兩個差別只有在是否區分大小寫。 雖然不太確定和使用 ToUpper 的比較方式在速度上面差多少,但是看起來可能有比較專業就是了,在這裡分享給大家。

參考資料:
Microsoft.Learn - Object.Equals Method
Microsoft.Learn - String.Equals Method

留言

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com