协慌网

登录 贡献 社区

你如何计算字符串中字符串(实际上是字符)的出现次数?

我正在做的事情,我意识到我想要计算一个字符串中可以找到多少/ s,然后它让我感到震惊,有几种方法可以做到,但无法决定什么是最好的(或最简单的)是。

目前我正在做的事情如下:

string source = "/once/upon/a/time/";
int count = source.Length - source.Replace("/", "").Length;

但我完全不喜欢它,任何接受者?

我真的不想为此挖出RegEx ,是吗?

我知道我的字符串将会有我正在搜索的术语,所以你可以认为......

当然,对于其中的字符串长度 > 1,

string haystack = "/once/upon/a/time";
string needle = "/";
int needleCount = ( haystack.Length - haystack.Replace(needle,"").Length ) / needle.Length;

答案

如果您使用的是. NET 3.5,则可以使用 LINQ 在单行中执行此操作:

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

如果您不想使用 LINQ,可以使用以下命令:

int count = source.Split('/').Length - 1;

您可能会惊讶地发现,您的原始技术似乎比其中任何一种快约 30%!我刚用 “/ once / on / a / time /” 做了快速基准测试,结果如下:

你原来 = 12 秒
source.Count = 19s
source.Split = 17s
foreach( 来自 bobwienholt 的回答 )= 10s

(时间是 50,000,000 次迭代,因此您不太可能注意到现实世界中的差异。)

string source = "/once/upon/a/time/";
int count = 0;
foreach (char c in source) 
  if (c == '/') count++;

必须比source.Replace()本身更快。

int count = new Regex(Regex.Escape(needle)).Matches(haystack).Count;