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

Это довольно распространенный шаблон:

SELECT DAY_IN, COUNT(*) AS arr,
        SUM(IF(PAT_STATUS  like '%ong%', 1, 0)) AS ONG1,
        SUM(IF(PAT_STATUS  like '%rtde%', 1, 0)) AS RTED,
        SUM(IF(PAT_STATUS  like '%pol%', 1, 0)) AS POL1,
        SUM(IF(PAT_STATUS  like '%para%', 1, 0)) AS para
FROM t_hospital 
WHERE DAY_IN between @start_check and @finish_check 
    and RES_DATE between @start_res and @finish_res  
    and ID_daily_hos =@daily_hos
GROUP BY DAY_IN
14
задан Renaud Bompuis 4 March 2009 в 08:43
поделиться

6 ответов

Хорошо, просто поднятый некоторый код ко времени Ваш метод против этого:

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

результат:

Ваш: 19 737 галочек

Мой: 118 галочек

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

Редактирование

Только из интереса, этого:

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

Входит приблизительно в в 2 500 галочках. Таким образом для остроты "Linqy" это довольно быстро.

35
ответ дан 1 December 2019 в 06:16
поделиться

Вы только считаете стандартный ASCII и не ГѓГђГЉ и т.д.

Как насчет

CommentText.ToCharArray().Where(c => Char.IsUpper(c)).Count()
3
ответ дан 1 December 2019 в 06:16
поделиться

Сначала нет никакой причины, которую необходимо назвать 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++;

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

6
ответ дан 1 December 2019 в 06:16
поделиться

То, что Вы делаете с тем кодом, должно создать набор с символами, затем создать новый набор, содержащий только символы верхнего регистра, затем цикл через тот набор только для обнаружения, сколько существует.

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

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

Редактирование: Удаленный ToCharArray звонят также как Matt предложенный.

2
ответ дан 1 December 2019 в 06:16
поделиться

Даже не тестируя я сказал бы

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

, быстрее, прочь теперь для тестирования его.

3
ответ дан 1 December 2019 в 06:16
поделиться

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

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

, но я не знаю если его особенно быстрое. Это не получит специальные символы также, я РЕДАКТИРОВАНИЕ s'pose

:

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

  • ответ: 20-30 мс
  • regex решение: 140-170 мс
2
ответ дан 1 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: