Vérifiez si une chaîne contient l’un des 10 caractères

J’utilise C # et je veux vérifier si une chaîne contient un des dix caractères, *, &, # etc etc.

Quel est le meilleur moyen?

Ce qui suit serait la méthode la plus simple, à mon avis:

var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1 

Ou dans un format peut-être plus facile à lire:

 var match = str.IndexOfAny("*&#".ToCharArray()) != -1 

Selon le contexte et les performances requirejs, vous pouvez souhaiter ou non mettre en cache le tableau de caractères.

Comme d’autres l’ont dit, utilisez IndexOfAny. Cependant, je l’utilise de cette façon:

 private static readonly char[] Punctuation = "*&#...".ToCharArray(); public static bool ContainsPunctuation(ssortingng 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 à numériser qu’une série de littéraux de caractères, IMO.

Bien sûr, si vous ne l’utilisez qu’une seule fois, la création perdue n’est pas un problème, vous pouvez soit utiliser:

 private const ssortingng Punctuation = "*&#..."; public static bool ContainsPunctuation(ssortingng text) { return text.IndexOfAny(Punctuation.ToCharArray()) >= 0; } 

ou

 public static bool ContainsPunctuation(ssortingng text) { return text.IndexOfAny("*&#...".ToCharArray()) >= 0; } 

Cela dépend vraiment de ce que vous trouvez plus lisible, que vous vouliez utiliser les caractères de ponctuation ailleurs et à quelle fréquence la méthode va être 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 Punctuation = new HashSet("*&#..."); public static bool ContainsOnePunctuationMark(ssortingng 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; } 

Si vous voulez juste voir s’il contient des caractères, je vous recommande d’utiliser ssortingng.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 une intersection, puis de vérifier les doublons.

 private static char[] characters = new char [] { '*','&',... }; public static bool ContainsOneCharacter(ssortingng 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; } 

ssortingng.IndexOfAny (…)

 var specialChars = new[] {'\\', '/', ':', '*', '<', '>', '|', '#', '{', '}', '%', '~', '&'}; foreach (var specialChar in specialChars.Where(str.Contains)) { Console.Write(ssortingng.Format("ssortingng must not contain {0}", specialChar)); } 

Merci à tous! (Et principalement Jon!): Cela m’a permis d’écrire ceci:

  private static readonly char[] Punctuation = "$€£".ToCharArray(); public static bool IsPrice(this ssortingng text) { return text.IndexOfAny(Punctuation) >= 0; } 

comme 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».