Saya menggunakan C # dan saya ingin memeriksa apakah sebuah string berisi salah satu dari sepuluh karakter, *, &, # dll.
Apakah cara terbaiknya?
Saya menggunakan C # dan saya ingin memeriksa apakah sebuah string berisi salah satu dari sepuluh karakter, *, &, # dll.
Apakah cara terbaiknya?
Jawaban:
Berikut ini akan menjadi metode paling sederhana, menurut saya:
var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1
Atau dalam bentuk yang mungkin lebih mudah dibaca:
var match = str.IndexOfAny("*&#".ToCharArray()) != -1
Bergantung pada konteks dan kinerja yang diperlukan, Anda mungkin ingin atau tidak ingin men-cache array karakter.
Seperti yang dikatakan orang lain, gunakan IndexOfAny. Namun, saya akan menggunakannya dengan cara ini:
private static readonly char[] Punctuation = "*&#...".ToCharArray();
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
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:
private const string Punctuation = "*&#...";
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation.ToCharArray()) >= 0;
}
atau
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny("*&#...".ToCharArray()) >= 0;
}
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.
private static readonly HashSet<char> Punctuation = new HashSet<char>("*&#...");
public static bool ContainsOnePunctuationMark(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)
{
return false; // This is the second punctuation character
}
seenOne = true;
}
}
return seenOne;
}
ToCharArrayformulir "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.
private static char[] characters = new char [] { '*','&',... };
public static bool ContainsOneCharacter(string text)
{
var intersection = text.Intersect(characters).ToList();
if( intersection.Count != 1)
return false; // Make sure there is only one character in the text
// Get a count of all of the one found character
if (1 == text.Count(t => t == intersection[0]) )
return true;
return false;
}
String.IndexOfAny(Char[])
Berikut adalah dokumentasi Microsoft .
Terima kasih semuanya! (Dan Terutama Jon!): Ini memungkinkan saya untuk menulis ini:
private static readonly char[] Punctuation = "$€£".ToCharArray();
public static bool IsPrice(this string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
saat saya sedang mencari cara yang baik untuk mendeteksi apakah string tertentu sebenarnya adalah harga atau kalimat, seperti 'Terlalu rendah untuk ditampilkan'.