116 votes

Je veux vérifier si une chaîne contient l'un des 10 caractères, quel est le meilleur moyen?

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?

225voto

Noldorin Points 67794

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.

43voto

Jon Skeet Points 692016

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;
}

5voto

Reed Copsey Points 315315

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;
}
 

4voto

Jason Williams Points 31901

string.IndexOfAny (...)

1voto

nologo Points 898
var specialChars = new[] {'\\', '/', ':', '*', '<', '>', '|', '#', '{', '}', '%', '~', '&'};

foreach (var specialChar in specialChars.Where(str.Contains))
{
    Console.Write(string.Format("string must not contain {0}", specialChar));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X