Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多次检查字符串中的字符_C#_C# 4.0 - Fatal编程技术网

C# 多次检查字符串中的字符

C# 多次检查字符串中的字符,c#,c#-4.0,C#,C# 4.0,遇到了一个小问题,我想多次检查字符串中是否有某个字符。这是字符串: string str01 = "?????????? ??????????, ??????????, ???????? !!!"; 现在我想检查字符“?”是否至少在字符串中出现10次。我尝试使用数组,但空格会欺骗我。提前谢谢 有帮助的是,string实现了IEnumerable,因此您可以使用一些LINQ: var result = str01.Count(x => x == '?') > 10; 请参阅。您可以

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

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

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

有帮助的是,
string
实现了
IEnumerable
,因此您可以使用一些LINQ:

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

请参阅。

您可以像这样使用LINQ进行尝试:

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

然后,您可以将count变量与所需的值进行比较。

如果希望保持数组方法,可以使用string.Replace()方法去掉空格和逗号:

str01 = str01.Replace(" ", "");
str01 = str01.Replace(",", "");
但是使用LINQ的其他解决方案可能更好。

对于非常(非常)长的字符串,您不应该使用可枚举的。计数解决方案,因为它们计算整个字符串(即使前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;
    }
}

如果您想确保
至少出现
10次,您可以使用Linq:


对于长字符串
,其中
+
跳过
+
任何
都可能比
计数(c=>c='?')更有效。
:我们在找到第10个
'?')时停止,不需要扫描整个字符串

你部分是对的:你不能使用
Count
(这可能是低效的),但你仍然可以使用Linq:
Skip
+
任何
都是一种扩展方法(和
public
one),你,IMHO,应该包括验证:如果
可枚举的
null
?如果其中的
,该怎么办?如果
Max==-1
(并且加重可枚举的测试用例
为空)该怎么办?您当前的代码确实解决了这个问题(十个
?”
),但在一般情况下,它是一个危险的实现。本应只是概念证明,但大多数情况下,您是对的,代码将按原样复制粘贴。增加了保护条款和固定比较。
var result = str01.AtLeast('?', 10);
  string source = "?????????? ??????????, ??????????, ???????? !!!";
  int repeatAtLeast = 10;

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