Check if a string contains one of 10 characters

前端 未结 6 920
情话喂你
情话喂你 2020-12-04 12:01

I\'m using C# and I want to check if a string contains one of ten characters, *, &, # etc etc.

What is the best way?

6条回答
  •  旧巷少年郎
    2020-12-04 12:28

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

提交回复
热议问题