多次检查字符串中的字符

时间:2016-07-20 09:30:24

标签: c# c#-4.0

遇到一个小问题,我想检查某个字符是否在字符串中多次。这是字符串:

string str01 = "?????????? ??????????, ??????????, ???????? !!!";

现在我想检查字符"?" 是否在字符串中至少10次。我尝试使用数组,但空格会欺骗它。提前谢谢!

5 个答案:

答案 0 :(得分:3)

有用的是,string实现了IEnumerable<char>,所以你可以使用一些LINQ:

var result = str01.Count(x => x == '?') > 10;

请参阅this fiddle

答案 1 :(得分:1)

对于非常(非常)长的字符串,您应使用Enumerable.Count解决方案,因为它们会评估整个字符串(即使前10个字符已经是问号)

<强>替代
如果可能,创建一个快捷方式的扩展类:

public static class AtLeastExtension
{
    public static bool AtLeast<T>(this IEnumerable<T> enumerable, T e, int Max)
    { 
        if (enumerable == null) throw new ArgumentNullException(nameof(enumerable));
        if (Max < 0) throw new ArgumentOutOfRangeException(nameof(Max));
        if (Max == 0) return true;

        int cnt = 0;
        foreach (var item in enumerable)
            if (object.Equals(item, e))
                if (++cnt >= Max) return true;
        return false;
    }
}

<强>用法

var result = str01.AtLeast('?', 10);

答案 2 :(得分:0)

您可以尝试使用 LINQ

int count = source.Count(f => f == '?');

而且你可以将count变量与你想要的值进行比较。

答案 3 :(得分:0)

如果你想保持你的数组方法,可以使用string.Replace()方法取出空格和逗号:

str01 = str01.Replace(" ", "");
str01 = str01.Replace(",", "");

但使用LINQ的其他解决方案可能更好。

答案 4 :(得分:0)

如果您只想确保?出现10次,则可以使用 Linq

  string source = "?????????? ??????????, ??????????, ???????? !!!";
  int repeatAtLeast = 10;

  bool appears = source
    .Where(c => c == '?')
    .Skip(repeatAtLeast - 1)
    .Any(); 
字符串Where + Skip + Any

可以比Count(c => c == '?') 更高效:我们停止当找到第10 '?'时,不需要扫描整个字符串。