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