Любые мысли об эффективности этого?...
CommentText.ToCharArray().Where(c => c >= 'A' && c <= 'Z').Count()
Любые мысли об эффективности этого?...
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 тиков
Довольно большая разница! Иногда самый прямой способ - наиболее эффективный.
Edit
Просто из интереса, это:
int count = s.Count(c => char.IsUpper(c));
Входит около 2500 тиков. Так что для линейного "Linqy" это очень быстро.
Сначала нет причин, по которым вам нужно вызывать 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++;
В общем, вызов любого метода будет медленнее, чем наложение кода, но такая оптимизация должна выполняться только в том случае, если вы абсолютно уверены, что это ваш шедевр в вашем коде.
Вы считаете только стандартный 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))
Edit: Удалено также вызов ToCharArray, как предположил Мэтт.
У меня есть этот
Regex x = new Regex("[A-Z]{1}",
RegexOptions.Compiled | RegexOptions.CultureInvariant);
int c = x.Matches(s).Count;
, но я не знаю, особенно ли это. Он также не получит особых символов, я использую
EDIT:
Быстрое сравнение с этим вопросом. Отладка в vshost, 10'000 итераций со строкой:
aBcDeFGHi1287jKK6437628asghwHllmTbynerA