Самый быстрый способ подсчета числа заглавных символов в С#

Любые мысли об эффективности этого?...

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

Ответ 1

Хорошо, только что сбил код с вашим методом против этого:

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

Результат:

Ваш: 19737 тиков

Шахта: 118 тиков

Довольно большая разница! Иногда самый прямой способ - наиболее эффективный.

Edit

Просто из интереса, это:

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

Входит около 2500 тиков. Так что для линейного "Linqy" это очень быстро.

Ответ 2

Сначала нет причин, по которым вам нужно вызывать ToCharArray(), поскольку, если CommentText - это строка, она уже является IEnumerable<char>. Во-вторых, вероятно, вы должны называть char.IsUpper вместо того, чтобы предполагать, что вы имеете дело только с значениями ASCII. Код должен выглядеть так:

CommentText.Count(char.IsUpper)

В-третьих, если вы беспокоитесь о скорости, не так много может побить старый цикл,

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

В общем, вызов любого метода будет медленнее, чем наложение кода, но такая оптимизация должна выполняться только в том случае, если вы абсолютно уверены, что это ваш шедевр в вашем коде.

Ответ 3

Вы считаете только стандартный ASCII, а не ÃÐÊ и т.д.

Как насчет

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

Ответ 4

Без тестирования я бы сказал

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

быстрее, выключите его, чтобы проверить его.

Ответ 5

Что вы делаете с этим кодом, так это создать коллекцию с символами, а затем создать новую коллекцию, содержащую только символы верхнего регистра, а затем прокрутить эту коллекцию только, чтобы узнать, сколько ее есть.

Это будет работать лучше (но все же не так хорошо, как простой цикл), поскольку он не создает промежуточные коллекции:

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

Edit: Удалено также вызов ToCharArray, как предположил Мэтт.

Ответ 6

У меня есть этот

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

, но я не знаю, особенно ли это. Он также не получит особых символов, я использую

EDIT:

Быстрое сравнение с этим вопросом. Отладка в vshost, 10'000 итераций со строкой:
aBcDeFGHi1287jKK6437628asghwHllmTbynerA

  • Ответ: 20-30 мс
  • Решение регулярного выражения: 140-170 мс