遇到一个小问题,我想检查某个字符是否在字符串中多次。这是字符串:
string str01 = "?????????? ??????????, ??????????, ???????? !!!";
现在我想检查字符"?" 是否在字符串中至少10次。我尝试使用数组,但空格会欺骗它。提前谢谢!
答案 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 '?'
时,不需要扫描整个字符串。