Это довольно распространенный шаблон:
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
Хорошо, просто поднятый некоторый код ко времени Ваш метод против этого:
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" это довольно быстро.
Вы только считаете стандартный ASCII и не ГѓГђГЉ и т.д.
Как насчет
CommentText.ToCharArray().Where(c => Char.IsUpper(c)).Count()
Сначала нет никакой причины, которую необходимо назвать 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++;
В целом, называние любого метода будет медленнее, чем встраивание кода, но этого вида оптимизации должно только быть сделано, если Вы абсолютно уверены, что это - узкое место в Вашем коде.
То, что Вы делаете с тем кодом, должно создать набор с символами, затем создать новый набор, содержащий только символы верхнего регистра, затем цикл через тот набор только для обнаружения, сколько существует.
Это будет работать лучше (но все еще вполне столь же хороший как простой цикл), поскольку он не создает промежуточные наборы:
CommentText.Count(c => Char.IsUpper(c))
Редактирование: Удаленный ToCharArray звонят также как Matt предложенный.
Даже не тестируя я сказал бы
int count = 0;
foreach (char c in commentText)
{
if (Char.IsUpper(c))
count++;
}
, быстрее, прочь теперь для тестирования его.
У меня есть это
Regex x = new Regex("[A-Z]{1}",
RegexOptions.Compiled | RegexOptions.CultureInvariant);
int c = x.Matches(s).Count;
, но я не знаю если его особенно быстрое. Это не получит специальные символы также, я РЕДАКТИРОВАНИЕ s'pose
:
Быстрое сравнение с ответом этого вопроса. Отладка в vshost, 10'000 повторений со строкой:
aBcDeFGHi1287jKK6437628asghwHllmTbynerA