10

我想检查一个字符串是否包含多个字符?如果我有一个字符串 12121.23.2 所以我想检查它是否包含多个 . 在字符串中。

4

4 回答 4

21

您可以比较IndexOfLastIndexOf检查 a 中是否有多个特定字符string而无需明确计数:

var s = "12121.23.2";
var ch = '.';
if (s.IndexOf(ch) != s.LastIndexOf(ch)) {
    ...
}
于 2013-07-06T11:30:38.833 回答
12

您可以使用 LINQ 轻松计算字符的出现次数:

string foo = "12121.23.2";
foo.Count(c => c == '.');
于 2013-07-06T11:32:26.137 回答
6

如果性能很重要,请自己编写:

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

这样一来,您只需通过字符串的内容,就可以尽早退出。在最坏的情况下,您只访问所有角色一次。在@dasblinkenlight 的回答中,您将访问所有字符两次,而在@mensi 的回答中,您必须计算所有实例,即使一旦您有两个实例,您也可以停止计算。此外,使用Count扩展方法涉及使用Enumerable<char>运行速度比直接访问特定索引处的字符慢的方法。

然后你可以写:

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'));

我还认为拥有一个能够准确解释您要实现的目标的功能会更好。但是,您也可以将任何其他答案包装在这样的函数中。

于 2013-07-06T11:45:28.197 回答
2
Boolean MoreThanOne(String str, Char c)
{
    return str.Count(x => x==c) > 1;
}
于 2013-07-06T11:43:51.957 回答