簡體   English   中英

計算c#中大寫字符數的最快方法

[英]Fastest way to count number of uppercase characters in c#

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

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

好吧,只是敲了一些代碼來計算你的方法:

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”單行程來說它很快。

首先,有沒有理由,你需要調用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++;

一般來說,調用任何方法都會比內聯代碼慢,但只有在你完全確定這是代碼中的瓶頸時才應該進行這種優化。

你只計算標准的ASCII而不是ÃÊÊ等。

怎么樣

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

我甚至沒有測試

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

現在更快,現在測試它。

您使用該代碼所做的是創建一個包含字符的集合,然后創建一個僅包含大寫字符的新集合,然后循環遍歷該集合,以找出有多少。

這將表現得更好(但仍然不如普通循環那么好),因為它不會創建中間集合:

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

編輯:也刪除了ToCharArray調用,如Matt建議的那樣。

我有這個

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毫秒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM