I\'m using C# and I want to check if a string contains one of ten characters, *, &, # etc etc.
What is the best way?
As others have said, use IndexOfAny. However, I'd use it in this way:
private static readonly char[] Punctuation = "*...".ToCharArray();
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
That way you don't end up creating a new array on each call. The string is also easier to scan than a series of character literals, IMO.
Of course if you're only going to use this once, so the wasted creation isn't a problem, you could either use:
private const string Punctuation = "*...";
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation.ToCharArray()) >= 0;
}
or
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny("*...".ToCharArray()) >= 0;
}
It really depends on which you find more readable, whether you want to use the punctuation characters elsewhere, and how often the method is going to be called.
EDIT: Here's an alternative to Reed Copsey's method for finding out if a string contains exactly one of the characters.
private static readonly HashSet Punctuation = new HashSet("*...");
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;
}