it-swarm-id.com

Yang umumnya terbaik untuk digunakan - StringComparison.OrdinalIgnoreCase atau StringComparison.InvariantCultureIgnoreCase?

Saya punya beberapa kode seperti ini:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

Saya tidak peduli dengan kasus ini. Haruskah saya menggunakan OrdinalIgnoreCase, InvariantCultureIgnoreCase, atau CurrentCultureIgnoreCase?

141
Dave Haynes

Dokumen .Net yang lebih baru sekarang memiliki tabel untuk membantu Anda memutuskan mana yang terbaik untuk digunakan dalam situasi Anda.

Dari MSDN's " Rekomendasi Baru untuk Menggunakan String di Microsoft .NET 2. "

Rangkuman: Pemilik kode yang sebelumnya menggunakan InvariantCulture untuk perbandingan string, casing, dan penyortiran harus sangat mempertimbangkan untuk menggunakan serangkaian kelebihan String baru di Microsoft .NET 2.0. Secara khusus, data yang dirancang untuk menjadi agnostik budaya dan tidak relevan secara bahasa harus mulai menentukan kelebihan beban menggunakan salah satu StringComparison.Ordinal atau StringComparison.OrdinalIgnoreCase anggota enumerasi StringComparison baru. Ini memberlakukan perbandingan byte-by-byte yang mirip dengan strcmp yang tidak hanya menghindari bug dari interpretasi linguistik dari string simbolis pada dasarnya, tetapi memberikan kinerja yang lebih baik.

156
Robert Taylor

Semuanya tergantung

Membandingkan string unicode sulit:

Implementasi pencarian string Unicode dan perbandingan dalam perangkat lunak pemrosesan teks harus memperhitungkan keberadaan poin kode yang setara. Dengan tidak adanya fitur ini, pengguna yang mencari urutan titik kode tertentu tidak akan dapat menemukan mesin terbang lain yang secara visual tidak dapat dibedakan yang memiliki representasi titik kode yang berbeda, tetapi secara kanonik, berbeda.

lihat: http://en.wikipedia.org/wiki/Unicode_equivalence


Jika Anda mencoba membandingkan 2 string unicode dengan case case peka dan ingin agar berfungsi [~ # ~] di mana-mana [~ # ~] , Anda memiliki masalah yang tidak mungkin.

Contoh klasik adalah Turki i , yang ketika huruf besar menjadi İ (perhatikan titik)

Secara default, framework .Net biasanya menggunakan CurrentCulture untuk fungsi terkait string, dengan pengecualian yang sangat penting dari .Equals yang menggunakan perbandingan ordinal (byte demi byte).

Ini mengarah, dengan desain, ke berbagai fungsi string berperilaku berbeda tergantung pada budaya komputer.


Meskipun demikian, kadang-kadang kita menginginkan "tujuan umum", case-sensitive, perbandingan.

Misalnya, Anda mungkin ingin perbandingan string Anda berperilaku dengan cara yang sama, apa pun komputer tempat aplikasi Anda diinstal.

Untuk mencapai ini kami memiliki 3 opsi:

  1. Tetapkan budaya secara eksplisit dan lakukan perbandingan kasus yang tidak sensitif menggunakan aturan kesetaraan unicode.
  2. Atur budaya ke Budaya Invariant dan lakukan perbandingan kasus dengan menggunakan aturan kesetaraan unicode.
  3. Gunakan OrdinalIgnoreCase yang akan menggunakan huruf besar string menggunakan InvariantCulture dan kemudian melakukan perbandingan byte dengan byte.

Aturan kesetaraan Unicode rumit, yang berarti menggunakan metode 1) atau 2) lebih mahal daripada OrdinalIgnoreCase. Fakta bahwa OrdinalIgnoreCase tidak melakukan normalisasi unicode khusus, berarti bahwa beberapa string yang merender dengan cara yang sama pada layar komputer, tidak akan dianggap identik. Sebagai contoh: "\u0061\u030a" dan "\u00e5" keduanya membuat å. Namun dalam perbandingan ordinal akan dianggap berbeda.

Yang Anda pilih sangat tergantung pada aplikasi yang Anda buat.

  • Jika saya sedang menulis aplikasi lini bisnis yang hanya digunakan oleh pengguna Turki, saya pasti akan menggunakan metode 1.
  • Jika saya hanya perlu membandingkan kasus sederhana "palsu" tidak sensitif, untuk mengatakan nama kolom dalam db, yang biasanya bahasa Inggris saya mungkin akan menggunakan metode 3.

Microsoft memiliki kumpulan rekomendasi mereka dengan panduan eksplisit. Namun, sangat penting untuk memahami gagasan kesetaraan unicode sebelum mendekati masalah ini.

Juga, harap diingat bahwa OrdinalIgnoreCase adalah jenis yang sangat istimewa beast, yang memilih dan memilih sedikit perbandingan ordinal dengan beberapa campuran dalam aspek leksikografis. Ini bisa membingungkan.

57
Sam Saffron

MSDN membuat beberapa rekomendasi yang cukup jelas tentang ini: http://msdn.Microsoft.com/en-us/library/ms973919.aspx

8
chessguy

Saya kira itu tergantung pada situasi Anda. Karena perbandingan ordinal sebenarnya melihat nilai Unicode numerik karakter, mereka tidak akan menjadi pilihan terbaik ketika Anda mengurutkan berdasarkan abjad. Untuk perbandingan string, meskipun, ordinal akan sedikit lebih cepat.

3
Bullines

Tergantung pada apa yang Anda inginkan, meskipun saya akan menghindar dari invariantculture kecuali Anda sangat yakin Anda tidak akan pernah ingin melokalisasi kode untuk bahasa lain. Gunakan CurrentCulture sebagai gantinya.

Juga, OrdinalIgnoreCase harus menghormati angka, yang mungkin atau mungkin tidak seperti yang Anda inginkan.

1
Joel Coehoorn

Jawaban yang sangat sederhana adalah, kecuali Anda menggunakan bahasa Turki, Anda tidak perlu menggunakan InvariantCulture.

Lihat tautan berikut:

Dalam C # apa perbedaan antara ToUpper () dan ToUpperInvariant ()?

0
TheMoot