Réponses:
Ce qui suit serait la méthode la plus simple, à mon avis:
var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1
Ou sous une forme éventuellement plus facile à lire:
var match = str.IndexOfAny("*&#".ToCharArray()) != -1
Selon le contexte et les performances requis, vous pouvez ou non vouloir mettre en cache le tableau char.
Comme d'autres l'ont dit, utilisez IndexOfAny. Cependant, je l'utiliserais de cette manière:
private static readonly char[] Punctuation = "*&#...".ToCharArray();
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
De cette façon, vous ne finissez pas par créer un nouveau tableau à chaque appel. La chaîne est également plus facile à analyser qu'une série de littéraux de caractères, IMO.
Bien sûr, si vous ne l'utilisez qu'une seule fois, donc la création gaspillée n'est pas un problème, vous pouvez soit utiliser:
private const string Punctuation = "*&#...";
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation.ToCharArray()) >= 0;
}
ou
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny("*&#...".ToCharArray()) >= 0;
}
Cela dépend vraiment de ce que vous trouvez le plus lisible, si vous souhaitez utiliser les caractères de ponctuation ailleurs et à quelle fréquence la méthode sera appelée.
EDIT: Voici une alternative à la méthode de Reed Copsey pour savoir si une chaîne contient exactement l'un des caractères.
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;
}
ToCharArraybien sûr utiliser le formulaire "en ligne" si nécessaire.
Si vous voulez juste voir s'il contient un caractère, je vous recommande d'utiliser string.IndexOfAny, comme suggéré ailleurs.
Si vous voulez vérifier qu'une chaîne contient exactement l'un des dix caractères, et un seul, cela devient un peu plus compliqué. Je pense que le moyen le plus rapide serait de vérifier par rapport à une intersection, puis de vérifier les doublons.
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[])
Voici la documentation de Microsoft .
var specialChars = new[] {'\\', '/', ':', '*', '<', '>', '|', '#', '{', '}', '%', '~', '&'};
foreach (var specialChar in specialChars.Where(str.Contains))
{
Console.Write(string.Format("string must not contain {0}", specialChar));
}
Merci à tous! (Et surtout Jon!): Cela m'a permis d'écrire ceci:
private static readonly char[] Punctuation = "$€£".ToCharArray();
public static bool IsPrice(this string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
car je cherchais un bon moyen de détecter si une certaine chaîne était en fait un prix ou une phrase, comme «Trop bas pour afficher».