Membandingkan string dalam C # cukup sederhana. Sebenarnya ada beberapa cara untuk melakukannya. Saya telah mendaftarkan beberapa di blok di bawah ini. Apa yang saya ingin tahu tentang perbedaan antara mereka dan kapan satu harus digunakan atas yang lain Haruskah seseorang dihindari dengan cara apa pun? Apakah ada lagi yang belum saya daftarkan?
string testString = "Test";
string anotherString = "Another";
if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}
(Catatan: Saya mencari persamaan dalam contoh ini, tidak kurang dari atau lebih besar dari tetapi merasa bebas untuk mengomentari itu juga)
c#
string
comparison
Craig
sumber
sumber
Jawaban:
Berikut adalah aturan untuk cara kerja fungsi-fungsi ini:
stringValue.CompareTo(otherStringValue)
null
datang sebelum stringCultureInfo.CurrentCulture.CompareInfo.Compare
, yang berarti akan menggunakan perbandingan yang bergantung pada budaya. Ini mungkin berarti bahwaß
akan membandingkan sama denganSS
di Jerman, atau serupastringValue.Equals(otherStringValue)
null
tidak dianggap sama dengan apa punStringComparison
opsi, itu akan menggunakan apa yang tampak seperti pemeriksaan kesetaraan ordinal langsung, yaituß
tidak sama denganSS
, dalam bahasa atau budaya apa punstringValue == otherStringValue
stringValue.Equals()
.==
Operator menyebut statisEquals(string a, string b)
metode (yang pada gilirannya pergi ke internalEqualsHelper
untuk melakukan perbandingan..Equals()
padanull
string yang mendapatnull
referensi pengecualian, sementara di==
tidak.Object.ReferenceEquals(stringValue, otherStringValue)
Hanya memeriksa referensi yang sama, yaitu bukan hanya dua string dengan konten yang sama, Anda membandingkan objek string dengan dirinya sendiri.
Perhatikan bahwa dengan opsi di atas yang menggunakan pemanggilan metode, ada kelebihan dengan lebih banyak opsi untuk menentukan cara membandingkan.
Saran saya jika Anda hanya ingin memeriksa kesetaraan adalah memutuskan apakah Anda ingin menggunakan perbandingan yang bergantung pada budaya atau tidak, dan kemudian menggunakan
.CompareTo
atau.Equals
, tergantung pada pilihan.sumber
String.Compare
?Dari MSDN:
Mereka menyarankan menggunakan
.Equals
alih-alih.CompareTo
ketika hanya mencari kesetaraan. Saya tidak yakin apakah ada perbedaan antara.Equals
dan==
untukstring
kelas. Saya kadang-kadang akan menggunakan.Equals
atauObject.ReferenceEquals
bukan==
untuk kelas saya sendiri jika seseorang datang di lain waktu dan mendefinisikan kembali==
operator untuk kelas itu.sumber
Jika Anda ingin tahu tentang perbedaan dalam metode BCL, Reflector adalah teman Anda :-)
Saya mengikuti panduan ini:
Pencocokan tepat: EDIT: Saya sebelumnya selalu menggunakan operator == pada prinsip bahwa di dalam Persamaan (string, string) objek == operator digunakan untuk membandingkan referensi objek tetapi tampaknya strA.Equals (strB) masih 1-11% keseluruhan lebih cepat dari string.Equals (strA, strB), strA == strB, dan string.CompareOrdinal (strA, strB). I loop diuji dengan StopWatch pada nilai string yang diinternir / tidak diinternir, dengan panjang string yang sama / berbeda, dan berbagai ukuran (1B hingga 5MB).
Pencocokan yang bisa dibaca manusia (budaya Barat, tidak sensitif huruf besar):
Kecocokan yang dapat dibaca manusia (Semua budaya lain, huruf / aksen / kana / dll yang tidak pasti yang didefinisikan oleh CultureInfo):
Kecocokan yang dapat dibaca manusia dengan aturan khusus (Semua budaya lain):
sumber
Seperti kata Ed , CompareTo digunakan untuk menyortir.
Namun, ada perbedaan antara .Equals dan ==.
== memutuskan untuk pada dasarnya kode berikut:
Alasan sederhananya adalah hal berikut ini akan menimbulkan pengecualian:
Dan yang berikut tidak akan:
sumber
Penjelasan dan praktik yang baik tentang masalah perbandingan string dapat ditemukan di artikel Rekomendasi Baru untuk Menggunakan Strings di Microsoft .NET 2.0 dan juga di Praktik Terbaik untuk Menggunakan Strings di .NET Framework .
Setiap metode yang disebutkan (dan lainnya) memiliki tujuan tertentu. Perbedaan utama di antara mereka adalah jenis StringComparison Enumeration yang mereka gunakan secara default. Ada beberapa opsi:
Setiap jenis perbandingan di atas menargetkan penggunaan yang berbeda:
Catatan, bahwa StringComparison Enumeration serta kelebihan untuk metode perbandingan string, ada sejak .NET 2.0.
Metode String.CompareTo (String)
Sebenarnya jenis implementasi aman Metode IComparable.CompareTo . Interpretasi default: CurrentCulture.
Pemakaian:
Jadi
Metode Membandingkan
Anggota statis dari Kelas String yang memiliki banyak kelebihan. Interpretasi default: CurrentCulture.
Metode String.Equals
Override dari kelas Object dan overload untuk keamanan tipe. Interpretasi standar: Ordinal. Perhatikan itu:
Kelas StringComparer
Ada juga cara lain untuk menangani perbandingan string terutama bertujuan untuk menyortir:
sumber
Bukan berarti kinerja biasanya penting dengan 99% dari waktu Anda perlu melakukan ini, tetapi jika Anda harus melakukan ini dalam satu lingkaran beberapa juta kali saya akan sangat menyarankan Anda menggunakan .Equals atau == karena segera setelah itu menemukan karakter yang tidak cocok itu membuang semuanya sebagai salah, tetapi jika Anda menggunakan CompareTo itu harus mencari tahu karakter mana yang kurang dari yang lain, yang mengarah ke waktu kinerja yang sedikit lebih buruk.
Jika aplikasi Anda akan berjalan di berbagai negara, saya sarankan Anda melihat implikasi CultureInfo dan mungkin menggunakan .Equals. Karena saya hanya benar-benar menulis aplikasi untuk AS (dan tidak peduli jika itu tidak berfungsi dengan baik oleh seseorang), saya selalu menggunakan ==.
sumber
Dalam formulir yang Anda daftarkan di sini, tidak ada banyak perbedaan di antara keduanya.
CompareTo
akhirnya memanggilCompareInfo
metode yang melakukan perbandingan menggunakan budaya saat ini;Equals
dipanggil oleh==
operator.Jika Anda mempertimbangkan kelebihan, maka segalanya menjadi berbeda.
Compare
dan==
hanya bisa menggunakan budaya saat ini untuk membandingkan string.Equals
danString.Compare
dapat mengambilStringComparison
argumen enumerasi yang memungkinkan Anda menentukan perbandingan budaya-tidak sensitif atau tidak sensitif-kasus. HanyaString.Compare
memungkinkan Anda untuk menentukanCultureInfo
dan melakukan perbandingan menggunakan budaya selain budaya default.Karena sifatnya yang fleksibel, saya menemukan saya menggunakan
String.Compare
lebih dari metode perbandingan lainnya; itu memungkinkan saya menentukan dengan tepat apa yang saya inginkan.sumber
Satu perbedaan besar yang perlu diperhatikan adalah .Equals () akan mengeluarkan pengecualian jika string pertama adalah null, sedangkan == tidak akan.
sumber
sumber
Menggunakan .Equals juga jauh lebih mudah dibaca .
sumber
dengan .Equals, Anda juga mendapatkan opsi StringComparison. sangat berguna untuk mengabaikan case dan hal lainnya.
btw, ini akan dinilai salah
Karena == membandingkan nilai a dan b (yang merupakan pointer) ini hanya akan bernilai true jika pointer menunjuk ke objek yang sama dalam memori. .Menyamakan dereferensi pointer dan membandingkan nilai yang disimpan di pointer. a. Setara (b) akan benar di sini.
dan jika Anda mengubah b ke:
maka a.Equals (b) salah, tetapi
akan benar
a.CompareTo (b) memanggil fungsi CompareTo string yang membandingkan nilai-nilai pada pointer dan mengembalikan <0 jika nilai yang disimpan di a lebih kecil dari nilai yang disimpan di b, mengembalikan 0 jika a. Sama dengan (b) benar, dan > 0 sebaliknya. Namun, ini peka huruf besar-kecil, saya pikir ada beberapa opsi bagi CompareTo untuk mengabaikan huruf besar dan kecil, tetapi tidak punya waktu untuk melihat sekarang. Seperti yang telah dinyatakan orang lain, ini akan dilakukan untuk menyortir. Membandingkan kesetaraan dengan cara ini akan menghasilkan overhead yang tidak perlu.
Saya yakin saya meninggalkan barang, tetapi saya pikir ini harus menjadi info yang cukup untuk mulai bereksperimen jika Anda memerlukan detail lebih lanjut.
sumber