Apakah ada cara untuk membuat pengembalian berikut ini benar?
string title = "ASTRINGTOTEST";
title.Contains("string");
Sepertinya tidak ada kelebihan yang memungkinkan saya untuk mengatur sensitivitas case .. Saat ini saya MENDUKUNG mereka berdua, tapi itu hanya konyol (yang saya maksudkan dengan masalah i18n yang datang dengan casing atas dan bawah).
PEMBARUAN
Pertanyaan ini sudah kuno dan sejak itu saya menyadari saya meminta jawaban sederhana untuk topik yang sangat luas dan sulit jika Anda ingin menyelidikinya sepenuhnya.
Untuk sebagian besar kasus, di mono-lingual, basis kode bahasa Inggris ini jawabannya akan cukup. Saya curiga karena kebanyakan orang yang datang ke sini termasuk dalam kategori ini, ini adalah jawaban yang paling populer. Namun jawaban
ini memunculkan masalah yang melekat bahwa kita tidak dapat membandingkan tidak peka huruf besar kecil sampai kita tahu kedua teks adalah budaya yang sama dan kita tahu apa budaya itu. Ini mungkin jawaban yang kurang populer, tetapi saya pikir itu lebih benar dan itulah sebabnya saya menandainya.
sumber
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
? Itu menggunakan budaya yang benar dan case-insensitive, itu tidak mengalokasikan string huruf kecil sementara, dan menghindari pertanyaan apakah mengkonversi ke huruf kecil dan membandingkan selalu sama dengan perbandingan case-insensitive.Anda bisa menggunakan Metode String.IndexOf dan lulus
StringComparison.OrdinalIgnoreCase
sebagai jenis pencarian untuk digunakan:Yang lebih baik adalah mendefinisikan metode ekstensi baru untuk string:
Perhatikan, bahwa propagasi nol
?.
tersedia sejak C # 6.0 (VS 2015), untuk penggunaan versi yang lebih lamaPEMAKAIAN:
sumber
paragraph.ToLower(culture).Contains(word.ToLower(culture))
denganCultureInfo.InvariantCulture
dan tidak memecahkan masalah lokalisasi. Mengapa terlalu rumit? stackoverflow.com/a/15464440/284795ToLower
versi ini menyertakan 2 alokasi yang tidak perlu dalam operasi perbandingan / pencarian. Mengapa tidak perlu mengalokasikan dalam skenario yang tidak memerlukannya?string
merupakanIEnumerable<char>
maka Anda tidak dapat menggunakannya untuk menemukan substringstring.IndexOf(string)
adalah dengan menggunakan budaya saat ini, sedangkan default untukstring.Contains(string)
adalah dengan menggunakan pembanding ordinal. Seperti yang kita ketahui, yang pertama dapat diubah menjadi mengambil kelebihan yang lebih lama, sedangkan yang terakhir tidak dapat diubah. Konsekuensi dari ketidakkonsistenan ini adalah contoh kode berikut:Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; string self = "Waldstrasse"; string value = "straße"; Console.WriteLine(self.Contains(value));/* False */ Console.WriteLine(self.IndexOf(value) >= 0);/* True */
Anda bisa menggunakan
IndexOf()
seperti ini:Karena 0 (nol) dapat berupa indeks, Anda mengecek terhadap -1.
MSDN
sumber
Solusi alternatif menggunakan Regex:
sumber
RegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant;
bagi siapa saja jika membantu."."
di"This is a sample string that doesn't contain the search string"
. Atau coba cari"(invalid"
, dalam hal ini.Regex.Escape
bisa membantu. Regex tampaknya masih tidak perlu ketikaIndexOf
/ ekstensiContains
sederhana (dan bisa dibilang lebih jelas).Anda selalu bisa menaikkan atau menurunkan string terlebih dahulu.
Ups, lihat saja tadi. Perbandingan kasus yang sensitif
*
mungkin akan tetap*
melakukan hal yang sama, dan jika kinerja tidak menjadi masalah, saya tidak melihat masalah dengan membuat salinan huruf besar dan membandingkannya. Saya bisa bersumpah bahwa saya pernah melihat membandingkan kasus-sensitif sekali ...sumber
Hanya .NET Core 2.0+ (mulai sekarang)
.NET Core telah memiliki sepasang metode untuk menangani hal ini sejak versi 2.0:
Contoh:
Pada waktunya, mereka mungkin akan masuk ke dalam .NET Standard dan, dari sana, ke semua implementasi lain dari Base Class Library.
sumber
Salah satu masalah dengan jawabannya adalah bahwa ia akan mengeluarkan pengecualian jika string adalah nol. Anda dapat menambahkannya sebagai cek agar tidak:
sumber
if (string.IsNullOrEmpty(source)) return string.IsNullOrEmpty(toCheck);
Kelas StringExtension adalah jalan maju, saya telah menggabungkan beberapa posting di atas untuk memberikan contoh kode lengkap:
sumber
StringComparison
?Ini bersih dan sederhana.
sumber
fileNamestr
memiliki karakter regex khusus (misalnya*
,+
,.
, dll) maka Anda akan berada di untuk cukup mengejutkan. Satu-satunya cara untuk membuat solusi ini berfungsi sepertiContains
fungsi yang tepat adalah melarikan dirifileNamestr
dengan melakukanRegex.Escape(fileNamestr)
.OrdinalIgnoreCase, CurrentCultureIgnoreCase, atau InvariantCultureIgnoreCase?
Karena ini tidak ada, berikut adalah beberapa rekomendasi tentang kapan harus menggunakan yang mana:
Dos
StringComparison.OrdinalIgnoreCase
untuk perbandingan sebagai standar aman Anda untuk pencocokan string agnostik kultur.StringComparison.OrdinalIgnoreCase
perbandingan untuk meningkatkan kecepatan.StringComparison.CurrentCulture-based
operasi string saat menampilkan output ke pengguna.StringComparison.Ordinal
atauStringComparison.OrdinalIgnoreCase
ketika perbandingan secaralinguistik tidak relevan (simbolis, misalnya).
ToUpperInvariant
daripadaToLowerInvariant
saat menormalisasi string untuk perbandingan.Larangan
StringComparison.InvariantCulture
string berbasis-dalam banyak kasus; salah satu dari sedikit pengecualian adalah data yang secara
linguistik bermakna tetapi agnostik secara budaya.
Berdasarkan aturan ini, Anda harus menggunakan:
sedangkan [YourDecision] tergantung pada rekomendasi dari atas.
tautan sumber: http://msdn.microsoft.com/en-us/library/ms973919.aspx
sumber
Ini adalah solusi termudah.
Menurut Indeks
Dengan Mengubah kasing
Oleh Regex
sumber
Saya tahu bahwa ini bukan C #, tetapi dalam kerangka kerja (VB.NET) sudah ada fungsi seperti itu
Varian C #:
sumber
The
InStr
Metode dari VisualBasic perakitan adalah yang terbaik jika Anda memiliki kekhawatiran tentang internasionalisasi (atau Anda bisa reimplement itu). Melihat di dalamnya dotNeetPeek menunjukkan bahwa itu tidak hanya memperhitungkan huruf besar dan kecil, tetapi juga untuk jenis kana dan karakter setengah-lebar-penuh (sebagian besar relevan untuk bahasa Asia, meskipun ada versi lebar-lebar dari alfabet Romawi juga ). Saya melewatkan beberapa detail, tetapi periksa metode pribadiInternalInStrText
:sumber
Seperti ini:
sumber
Gunakan ini:
sumber
Contains
tidakCompare
.Contains
denganIndexOf
. Jadi pendekatan ini sama-sama membantu! Contoh kode C # pada halaman ini menggunakan string.Compare (). Pilihan tim SharePoint yaitu!Ini sangat mirip dengan contoh lain di sini, tetapi saya telah memutuskan untuk menyederhanakan enum menjadi bool, primer karena alternatif lain biasanya tidak diperlukan. Ini contoh saya:
Dan penggunaannya adalah seperti:
sumber
Menggunakan RegEx adalah cara langsung untuk melakukan ini:
sumber
Hanya untuk membangun jawaban di sini, Anda dapat membuat metode ekstensi string untuk membuatnya sedikit lebih ramah pengguna:
sumber
return CultureInfo.CurrentCulture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0;
saja.jika Anda ingin memeriksa apakah string yang Anda kirimkan dalam string maka ada metode sederhana untuk itu.
Nilai boolean ini akan kembali jika string berisi atau tidak
sumber
Sederhana dan berfungsi
sumber
sumber
Anda dapat menggunakan
string.indexof ()
fungsi. Ini akan menjadi case-sensitivesumber
Kuncinya di sini adalah untuk mencari string, mengabaikan case, tetapi untuk tetap persis sama (dengan case yang sama).
Output adalah "Reset"
sumber
sumber
Cara sederhana untuk pemula:
sumber