Відповіді:
На мій погляд, найпростішим методом був би наступний:
var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1
Або в можливо легшій для читання формі:
var match = str.IndexOfAny("*&#".ToCharArray()) != -1
Залежно від необхідного контексту та продуктивності, ви можете або не захочете кешувати масив символів.
Як уже говорили інші, використовуйте IndexOfAny. Однак я б використовував це таким чином:
private static readonly char[] Punctuation = "*&#...".ToCharArray();
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
Таким чином, ви не закінчите створювати новий масив під час кожного дзвінка. Рядок також простіше сканувати, ніж ряд буквених символів, IMO.
Звичайно, якщо ви збираєтесь використовувати це лише один раз, тому марно створене не є проблемою, ви можете використовувати:
private const string Punctuation = "*&#...";
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation.ToCharArray()) >= 0;
}
або
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny("*&#...".ToCharArray()) >= 0;
}
Це дійсно залежить від того, який ви знайдете більш читабельний, чи хочете ви використовувати пунктуаційні символи в іншому місці та як часто метод буде викликаний.
EDIT: Ось альтернатива методу Ріда Копсі для з'ясування того, чи містить рядок точно один із символів.
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;
}
ToCharArray, звичайно, можете скористатися формою "inline".
Якщо ви просто хочете побачити, чи містить він якийсь символ, я рекомендую використовувати string.IndexOfAny, як це запропоновано в інших місцях.
Якщо ви хочете переконатися, що рядок містить точно один з десяти символів і лише один, то це стає трохи складніше. Я вважаю, що найшвидшим способом було б перевірити наявність перехрестя, а потім перевірити наявність дублікатів.
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[])
Ось документація Microsoft .
Дякую всім вам! (І головним чином Джон!): Це дозволило мені написати це:
private static readonly char[] Punctuation = "$€£".ToCharArray();
public static bool IsPrice(this string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
тому що я шукав хороший спосіб визначити, чи певна рядок насправді є ціною чи пропозицією, як-от "Занадто низька кількість для показу".