计算文本中的字符和单词,是否可以进行优化?

时间:2016-01-21 10:10:25

标签: c#

我想用大文字计算字符,我用这段代码来计算:

string s = textBox.Text;
int chars = 0;
int words = 0;

foreach(var v in s.ToCharArray())
    chars++;

foreach(var v in s.Split(' '))
    words++;

这段代码有效,但对于大文本来说似乎相当慢,所以我该如何改进呢?

4 个答案:

答案 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;