J'utilise C # et je veux vérifier si une chaîne contient l'un des dix caractères, *, &, # etc. etc. Quelle est la meilleure façon?
Réponses
Trop de publicités?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 requises, vous pouvez ou non souhaiter mettre en cache le tableau de caractères.
Comme d'autres l'ont dit, l'utilisation des IndexOfAny. Cependant, j'aimerais l'utiliser de cette façon:
private static readonly char[] Punctuation = "*&#...".ToCharArray();
public static bool ContainsPunctuation(string text)
{
return text.IndexOfAny(Punctuation) >= 0;
}
De cette façon, vous ne finissent pas de la création d'un nouveau tableau à chaque appel. La chaîne est également plus faciles à analyser que d'une série de chaînes de caractères, de l'OMI.
Bien sûr, si vous n'utilisez qu'une seule fois, de sorte que le gaspillage de création 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 sur lequel vous trouvez plus lisible, si vous souhaitez utiliser les caractères de ponctuation, d'ailleurs, et comment souvent, la méthode va être appelé.
EDIT: Voici une alternative à Reed Copsey de la méthode pour déterminer si une chaîne contient exactement un des personnages.
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;
}
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 crois que le moyen le plus rapide serait de vérifier par rapport à une intersection, puis de rechercher 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;
}