简体   繁体   中英

How to identify if a string contains more than one instance of a specific character?

I want to check if a string contains more than one character in the string? If i have a string 12121.23.2 so i want to check if it contains more than one . in the string.

You can compare IndexOf to LastIndexOf to check if there is more than one specific character in a string without explicit counting:

var s = "12121.23.2";
var ch = '.';
if (s.IndexOf(ch) != s.LastIndexOf(ch)) {
    ...
}

You can easily count the number of occurences of a character with LINQ:

string foo = "12121.23.2";
foo.Count(c => c == '.');

If performance matters, write it yourself:

public static bool ContainsDuplicateCharacter(this string s, char c)
{
    bool seenFirst = false;
    for (int i = 0; i < s.Length; i++)
    {
        if (s[i] != c)
            continue;
        if (seenFirst)
            return true;
        seenFirst = true;
    }
    return false;
}

In this way, you only make one pass through the string's contents, and you bail out as early as possible. In the worst case you visit all characters only once. In @dasblinkenlight's answer, you would visit all characters twice, and in @mensi's answer, you have to count all instances, even though once you have two you can stop the calculation. Further, using the Count extension method involves using an Enumerable<char> which will run more slowly than directly accessing the characters at specific indices.

Then you may write:

string s = "12121.23.2";

Debug.Assert(s.ContainsDuplicateCharacter('.'));
Debug.Assert(s.ContainsDuplicateCharacter('1'));
Debug.Assert(s.ContainsDuplicateCharacter('2'));
Debug.Assert(!s.ContainsDuplicateCharacter('3'));
Debug.Assert(!s.ContainsDuplicateCharacter('Z'));

I also think it's nicer to have a function that explains exactly what you're trying to achieve. You could wrap any of the other answers in such a function too, however.

Boolean MoreThanOne(String str, Char c)
{
    return str.Count(x => x==c) > 1;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM