Dengan cara itu Anda tidak akan membuat array baru pada setiap panggilan. String tersebut juga lebih mudah dipindai daripada serangkaian literal karakter, IMO.
Tentu saja jika Anda hanya akan menggunakan ini sekali, jadi kreasi yang terbuang tidak menjadi masalah, Anda dapat menggunakan:
Ini sangat bergantung pada mana yang menurut Anda lebih mudah dibaca, apakah Anda ingin menggunakan karakter tanda baca di tempat lain, dan seberapa sering metode tersebut akan dipanggil.
EDIT: Berikut adalah alternatif metode Reed Copsey untuk mengetahui apakah sebuah string berisi persis salah satu karakter.
privatestaticreadonlyHashSet<char>Punctuation=newHashSet<char>("*&#...");publicstaticboolContainsOnePunctuationMark(string text){bool seenOne =false;foreach(char c in text){// TODO: Experiment to see whether HashSet is really faster than// Array.Contains. If all the punctuation is ASCII, there are other// alternatives...if(Punctuation.Contains(c)){if(seenOne){returnfalse;// This is the second punctuation character}
seenOne =true;}}return seenOne;}
Saya kira itu layak untuk menyimpan array karakter jika kinerja adalah masalah, tetapi sekali lagi itu mungkin tidak sepadan tergantung pada konteksnya.
Noldorin
1
Ya, jika Anda hanya menggunakannya dalam metode yang akan dijalankan setelah itu mungkin tidak sepadan. Namun, saya pikir ini meningkatkan keterbacaan serta kinerja. Anda dapat menggunakan ToCharArrayformulir "inline" jika diperlukan, tentunya.
Jon Skeet
1
@canon: Seberapa besar setnya? Untuk set yang sangat, sangat kecil, saya berharap Array.Contains lebih cepat. Untuk set besar, HashSet cenderung menang bermil-mil.
Jon Skeet
5
Jika Anda hanya ingin melihat apakah itu berisi karakter apa pun, saya sarankan menggunakan string.IndexOfAny, seperti yang disarankan di tempat lain.
Jika Anda ingin memverifikasi bahwa sebuah string berisi tepat satu dari sepuluh karakter, dan hanya satu, maka itu menjadi sedikit lebih rumit. Saya yakin cara tercepat adalah memeriksa titik-temu, lalu memeriksa duplikat.
privatestaticchar[] characters =newchar[]{'*','&',...};publicstaticboolContainsOneCharacter(string text){var intersection = text.Intersect(characters).ToList();if( intersection.Count!=1)returnfalse;// Make sure there is only one character in the text// Get a count of all of the one found characterif(1== text.Count(t => t == intersection[0]))returntrue;returnfalse;}
Ya - Saya kira satu putaran mungkin lebih cepat dalam kasus ini, terutama dengan set kecil tanda baca. Saya penasaran untuk mencoba menguji ini dengan string besar untuk melihat mana yang benar-benar lebih cepat.
Reed Copsey
1
Saya pikir menemukan perpotongan dari dua string harus berjalan karakter demi karakter, jadi saya tidak dapat melihat bagaimana itu akan lebih cepat ... dan rute yang saya sarankan tidak hanya menggunakan satu lintasan, tetapi juga memiliki pilihan "keluar awal". Bayangkan jika teks adalah satu juta karakter, tetapi dua yang pertama sama-sama "*" :)
var specialChars =new[]{'\\','/',':','*','<','>','|','#','{','}','%','~','&'};foreach(var specialChar in specialChars.Where(str.Contains)){Console.Write(string.Format("string must not contain {0}", specialChar));}
saat saya sedang mencari cara yang baik untuk mendeteksi apakah string tertentu sebenarnya adalah harga atau kalimat, seperti 'Terlalu rendah untuk ditampilkan'.
Saya tahu ini sudah kuno, tetapi untuk memperjelas ini bukan cara yang baik untuk mencocokkan mata uang ... Jika Anda meminta seseorang menulis "Ke $ ha", itu akan cocok sebagai harga ... Alih-alih mengacu pada satu cara yang tepat untuk mendeteksi mata uang yang ditentukan di sini: stackoverflow.com/questions/7214513/…
Jawaban:
Berikut ini akan menjadi metode paling sederhana, menurut saya:
Atau dalam bentuk yang mungkin lebih mudah dibaca:
Bergantung pada konteks dan kinerja yang diperlukan, Anda mungkin ingin atau tidak ingin men-cache array karakter.
sumber
Seperti yang dikatakan orang lain, gunakan IndexOfAny. Namun, saya akan menggunakannya dengan cara ini:
Dengan cara itu Anda tidak akan membuat array baru pada setiap panggilan. String tersebut juga lebih mudah dipindai daripada serangkaian literal karakter, IMO.
Tentu saja jika Anda hanya akan menggunakan ini sekali, jadi kreasi yang terbuang tidak menjadi masalah, Anda dapat menggunakan:
atau
Ini sangat bergantung pada mana yang menurut Anda lebih mudah dibaca, apakah Anda ingin menggunakan karakter tanda baca di tempat lain, dan seberapa sering metode tersebut akan dipanggil.
EDIT: Berikut adalah alternatif metode Reed Copsey untuk mengetahui apakah sebuah string berisi persis salah satu karakter.
sumber
ToCharArray
formulir "inline" jika diperlukan, tentunya.Jika Anda hanya ingin melihat apakah itu berisi karakter apa pun, saya sarankan menggunakan string.IndexOfAny, seperti yang disarankan di tempat lain.
Jika Anda ingin memverifikasi bahwa sebuah string berisi tepat satu dari sepuluh karakter, dan hanya satu, maka itu menjadi sedikit lebih rumit. Saya yakin cara tercepat adalah memeriksa titik-temu, lalu memeriksa duplikat.
sumber
Berikut adalah dokumentasi Microsoft .
sumber
sumber
Terima kasih semuanya! (Dan Terutama Jon!): Ini memungkinkan saya untuk menulis ini:
saat saya sedang mencari cara yang baik untuk mendeteksi apakah string tertentu sebenarnya adalah harga atau kalimat, seperti 'Terlalu rendah untuk ditampilkan'.
sumber