我想用大文字计算字符,我用这段代码来计算:
string s = textBox.Text;
int chars = 0;
int words = 0;
foreach(var v in s.ToCharArray())
chars++;
foreach(var v in s.Split(' '))
words++;
这段代码有效,但对于大文本来说似乎相当慢,所以我该如何改进呢?
答案 0 :(得分:5)
您不需要另一个字符数组,您可以直接使用String.Length
:
int chars = s.Length;
int words = s.Split().Length;
旁注:如果您在没有参数的情况下调用String.Split
,则所有white-space characters都将用作分隔符。这些包括空格,制表符和换行符。这不是可能的单词分隔符的完整列表,但它比" "
更好。
您还将连续的空格计为不同的"单词"。使用StringSplitOptions.RemoveEmptyEntries
:
string[] wordSeparators = { "\r\n", "\n", ",", ".", "!", "?", ";", ":", " ", "-", "/", "\\", "[", "]", "(", ")", "<", ">", "@", "\"", "'" }; // this list is probably too extensive, tim.schmelter@myemail.com would count as 4 words, but it should give you an idea
string[] words = s.Split(wordSeparators, StringSplitOptions.RemoveEmptyEntries);
int wordCount = words.Length;
答案 1 :(得分:2)
您可以一次性完成此操作,而无需复制字符串:
int chars = 0;
int words = 0;
//keep track of spaces so as to only count nonspace-space-nonspace transitions
//it is initialized to true to count the first word only when we come to it
bool lastCharWasSpace = true;
foreach (var c in s)
{
chars++;
if (c == ' ')
{
lastCharWasSpace = true;
}
else if (lastCharWasSpace)
{
words++;
lastCharWasSpace = false;
}
}
请注意我在这里不使用string.Split
的原因是它在引擎盖下做了一堆字符串副本以返回结果数组。由于您不使用内容,而只是对计数感兴趣,这是浪费时间和内存 - 特别是如果您有足够大的文本必须拖拽到主内存,或者更糟糕的是交换空间。
另一方面,请注意string.Split
默认情况下使用的分隔符列表比' '
更长,因此您可能需要为其添加其他条件if
声明。
答案 2 :(得分:1)
您只需使用
即可int numberOfLetters = textBox.Length;
或使用LINQ
int numberOfLetters = textBox.ToCharArray().Count();
或
int numberOfLetters = 0;
foreach (char letter in textBox)
{
numberOfLetters++;
}
答案 3 :(得分:0)
var chars = textBox.Text.Length;
var words = textbox.Text.Count(c => c == ' ') + 1;