Membandingkan string di C#

Tip

Artikel ini adalah bagian dari bagian Dasar-Dasar untuk pengembang yang sudah mengetahui setidaknya satu bahasa pemrograman dan mempelajari C#. Jika Anda baru menggunakan pemrograman, mulailah dengan tutorial Memulai terlebih dahulu.

Berasal dari bahasa lain? C# == pada string membandingkan nilai, bukan referensi, seperti Java equals atau JavaScript===. Perbedaan utamanya adalah bahwa C# memungkinkan Anda memilih antara perbandingan ordinal (biner) dan perbandingan peka terhadap budaya melalui nilai StringComparison.

Anda membandingkan string untuk menjawab salah satu dari dua pertanyaan: Apakah kedua string ini sama? atau Dalam urutan apa string ini diurutkan? C# memungkinkan Anda mengontrol dua faktor independen ketika Anda menjawab salah satu pertanyaan:

  • Sensitivitas kasus — apakah "Hello" dan "hello" diperlakukan sama.
  • Jenis perbandinganordinal (bandingkan nilai biner setiap karakter) atau sadar budaya (terapkan aturan linguistik budaya).

Enumerasi StringComparison menggabungkan faktor-faktor ini ke dalam satu nilai yang Anda berikan ke metode perbandingan.

Bandingkan untuk kesetaraan

Metode String.Equals dan operator == sama-sama melakukan perbandingan ordinal dan peka huruf besar/kecil secara bawaan. Perbandingan ordinal memeriksa nilai biner setiap karakter, sehingga cepat dan memberikan hasil yang sama pada setiap komputer. Anda dapat menyatakan maksud Anda secara eksplisit dengan memanggil overload yang menerima nilai StringComparison:

string root = @"C:\users";
string root2 = @"C:\Users";

// Equals and == both perform a case-sensitive, ordinal comparison.
Console.WriteLine(root.Equals(root2));
// => False
Console.WriteLine(root == root2);
// => False

// Pass a StringComparison value to state the intent explicitly.
Console.WriteLine(root.Equals(root2, StringComparison.Ordinal));
// => False

Untuk mengabaikan kasus sambil menyimpan semantik ordinal, teruskan StringComparison.OrdinalIgnoreCase:

string root = @"C:\users";
string root2 = @"C:\Users";

// OrdinalIgnoreCase compares the binary values but ignores case.
bool equalIgnoringCase = string.Equals(root, root2, StringComparison.OrdinalIgnoreCase);
Console.WriteLine(equalIgnoringCase);
// => True

Bandingkan untuk urutan pengurutan

Untuk menentukan urutan alih-alih kesetaraan, gunakan String.Compare. Ini mengembalikan angka negatif, nol, atau angka positif untuk menunjukkan apakah string pertama diurutkan sebelum, berada pada posisi yang sama dengan, atau setelah string kedua:

string first = "Avocado";
string second = "Banana";

// Compare returns a negative number, zero, or a positive number
// to indicate sort order. Specify the comparison type explicitly.
int order = string.Compare(first, second, StringComparison.Ordinal);
Console.WriteLine(order < 0
    ? $"'{first}' sorts before '{second}'."
    : $"'{first}' sorts at or after '{second}'.");
// => 'Avocado' sorts before 'Banana'.

Important

Compare dan CompareTo secara default menggunakan perbandingan yang peka terhadap budaya, sedangkan Equals dan == secara default menggunakan perbandingan ordinal. Untuk menghindari kejutan, berikan nilai eksplisit StringComparison sehingga kode Anda menyatakan perilaku mana yang diinginkannya.

Bandingkan dengan konstanta menggunakan pencocokan pola is atau switch

Ketika nilai yang Anda bandingkan adalah konstanta, Anda dapat menggunakan is operator dengan pola konstan sebagai alternatif yang dapat dibaca untuk ==:

string status = "Ready";

// When the right operand is a constant, the is operator and a
// constant pattern read as an alternative to ==.
if (status is "Ready")
{
    Console.WriteLine("The system is ready.");
}
// => The system is ready.

Untuk membandingkan string dengan beberapa konstanta, gunakan switch ekspresi. Setiap lengan menguji pola konstanta, dan pola buang (_) menangani setiap nilai yang tidak cocok. Contoh berikutnya memetakan kata kunci arah ke instruksi perjalanan:

foreach (string heading in new[] { "North", "South", "East", "West", "NE" })
{
    // A switch expression matches each constant pattern in turn and
    // returns the first match. The discard (_) handles every other value.
    string instruction = heading switch
    {
        "North" => "Travel due North for 10 km.",
        "South" => "Travel due South for 10 km.",
        "East" => "Travel due East for 10 km.",
        "West" => "Travel due West for 10 km.",
        _ => $"Unknown heading: {heading}.",
    };
    Console.WriteLine(instruction);
}
// => Travel due North for 10 km.
// => Travel due South for 10 km.
// => Travel due East for 10 km.
// => Travel due West for 10 km.
// => Unknown heading: NE.

Ekspresi switch yang menguji konstanta string melakukan perbandingan ordinal yang peka terhadap huruf besar/kecil yang sama seperti ==, sehingga "north" tidak cocok dengan cabang "North".

Pilih perbandingan yang tepat

Pilih jenis perbandingan berdasarkan data, bukan di luar kebiasaan:

  • Untuk pengidentifikasi, jalur file, token protokol, dan teks lain yang ditentukan mesin, gunakan Ordinal (atau OrdinalIgnoreCase untuk mengabaikan kasus). Perbandingan ordinal bersifat cepat dan konsisten di berbagai budaya.
  • Untuk teks yang dibaca dan diurutkan pengguna, seperti nama atau judul produk, gunakan CurrentCulture agar urutan sesuai dengan harapan pengguna.

Perbandingan sadar budaya menerapkan aturan linguistik yang bervariasi menurut budaya dan dapat menghasilkan hasil yang mengejutkan. Misalnya, beberapa budaya memperlakukan "ss" dan "ß" setara, dan urutan string dapat berubah di antara mesin. Karena variabilitas tersebut, gunakan perbandingan yang mempertimbangkan budaya hanya untuk teks bahasa alami yang sesungguhnya, dan gunakan metode perbandingan yang sama setiap kali Anda mengurutkan maupun menelusuri koleksi.

Untuk perlakuan mendalam tentang perbandingan sensitif budaya, termasuk pertimbangan globalisasi dan perbedaan platform, lihat Praktik terbaik untuk membandingkan string dalam .NET.

Baca juga