计算c#中大写字符数的最快方法

时间:2009-03-04 08:30:42

标签: c# linq

对此效率的任何想法? ...

CommentText.ToCharArray().Where(c => c >= 'A' && c <= 'Z').Count()

6 个答案:

答案 0 :(得分:34)

好的,只是敲了一些代码来计算你的方法:

int count = 0;
for (int i = 0; i < s.Length; i++)
{
    if (char.IsUpper(s[i])) count++;
}

结果:

  

你的:19737蜱

     

我的:118蜱

相当大的差异!有时最直接的方式是效率最高。

修改

出于兴趣,这个:

int count = s.Count(c => char.IsUpper(c));

大约2500蜱。所以对于一个“Linqy”单行程来说它很快。

答案 1 :(得分:6)

首先,您无需调用ToCharArray(),因为假设CommentText是一个字符串,它已经是IEnumerable<char>。其次,您可能应该调用char.IsUpper而不是假设您只处理ASCII值。代码应该看起来像,

CommentText.Count(char.IsUpper)

第三,如果你担心速度,那么没有多少可以击败旧的for循环,

int count = 0;
for (int i = 0; i < CommentText.Length; i++) 
   if (char.IsUpper(CommentText[i]) count++;

一般来说,调用任何方法都会比内联代码慢,但只有在你完全确定这是代码中的瓶颈时才应该进行这种优化。

答案 2 :(得分:3)

你只计算标准的ASCII而不是等等。

怎么样

CommentText.ToCharArray().Where(c => Char.IsUpper(c)).Count()

答案 3 :(得分:3)

没有测试我会说

int count = 0;
foreach (char c in commentText)
{
    if (Char.IsUpper(c))
        count++;
}

速度更快,现在不用来测试它。

答案 4 :(得分:2)

您正在使用该代码创建一个包含字符的集合,然后创建一个仅包含大写字符的新集合,然后遍历该集合以查找有多少字符。

这会表现得更好(但仍然不如普通循环好),因为它不会创建中间集合:

CommentText.Count(c => Char.IsUpper(c))

编辑:也像Matt建议的那样删除了ToCharArray调用。

答案 5 :(得分:2)

我有这个

Regex x = new Regex("[A-Z]{1}", 
  RegexOptions.Compiled | RegexOptions.CultureInvariant);
int c = x.Matches(s).Count;

但我不知道它是否特别快。它也不会得到特殊的字符,我是

修改

快速比较这个问题的答案。在vshost中调试,使用字符串进行10'000次迭代:
aBcDeFGHi1287jKK6437628asghwHllmTbynerA

  • 答案:20-30毫秒
  • 正则表达式解决方案:140-170 ms