如何确定一个字符串是否包含多个特定字符的实例?

10

我想检查一个字符串中是否含有多个相同的字符。例如,如果我有一个字符串 12121.23.2 ,我想检查它是否包含多个 "."。

4个回答

22

你可以将IndexOfLastIndexOf进行比较,以检查一个string中是否有超过一个特定字符,而无需显式计数:

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

如果字符根本不存在,则此方法将失败,因为两个索引都会计算为-1。 - Drew Noakes
4
为什么?如果字符不存在,两个函数都返回“-1”,所以“!=”的结果为“false”。你需要输入两个或更多字符:对于零个或一个字符,第一个和最后一个索引是相同的(实际索引为“-1”)。 - Sergey Kalinichenko

13

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

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

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

我认为最好有一个能够准确解释你想要实现的函数。当然,你也可以将其他答案封装在这样的函数中。


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

字符串和字符中不能有等号。 - user5710892
是的,我在我的回答中也没有使用它,请理解我在做什么,如果你不明白,那就尝试运行一下,看看是否有效。 - Rohit Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接