对此效率的任何想法? ...
CommentText.ToCharArray().Where(c => c >= 'A' && c <= 'Z').Count()
答案 0 :(得分:34)
好的,只是敲了一些代码来计算你的方法:
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”单行程来说它很快。
答案 1 :(得分:6)
首先,您无需调用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++;
一般来说,调用任何方法都会比内联代码慢,但只有在你完全确定这是代码中的瓶颈时才应该进行这种优化。
答案 2 :(得分:3)
你只计算标准的ASCII而不是等等。
怎么样
CommentText.ToCharArray().Where(c => Char.IsUpper(c)).Count()
答案 3 :(得分:3)
没有测试我会说
int count = 0;
foreach (char c in commentText)
{
if (Char.IsUpper(c))
count++;
}
速度更快,现在不用来测试它。
答案 4 :(得分:2)
您正在使用该代码创建一个包含字符的集合,然后创建一个仅包含大写字符的新集合,然后遍历该集合以查找有多少字符。
这会表现得更好(但仍然不如普通循环好),因为它不会创建中间集合:
CommentText.Count(c => Char.IsUpper(c))
编辑:也像Matt建议的那样删除了ToCharArray调用。
答案 5 :(得分:2)
我有这个
Regex x = new Regex("[A-Z]{1}",
RegexOptions.Compiled | RegexOptions.CultureInvariant);
int c = x.Matches(s).Count;
但我不知道它是否特别快。它也不会得到特殊的字符,我是
修改强>
快速比较这个问题的答案。在vshost中调试,使用字符串进行10'000次迭代:
的 aBcDeFGHi1287jKK6437628asghwHllmTbynerA 强>