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

ikfrs5lh  于 2023-07-31  发布在  C#
关注(0)|答案(6)|浏览(106)

这样做的效率如何?...

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

字符串

bjp0bcyl

bjp0bcyl1#

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

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”的一行程序来说,它是相当快的。

slsn1g29

slsn1g292#

首先,没有理由需要调用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++;


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

busg9geu

busg9geu3#

您只计算标准ASCII而不计算等。
不如

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

字符串

wko9yo5t

wko9yo5t4#

不用测试我就说

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

字符串
更快,现在去测试一下。

cyej8jka

cyej8jka5#

您对该代码所做的是创建一个包含字符的集合,然后创建一个仅包含大写字符的新集合,然后循环遍历该集合,以找出有多少个大写字符。
这将执行得更好(但仍然不如普通循环),因为它不会创建中间集合:

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

字符串
编辑:按照Matt的建议,也删除了ToCharArray调用。

vc9ivgsu

vc9ivgsu6#

我来搞定

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

字符串
但我不知道是不是特别快我猜也不会有特别的字符

编辑:

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

aBcDeFGHi1287jKK6437628asghwHllmTbynerA

  • 答案:20-30 ms
  • regex解决方案:140-170毫秒

相关问题