计算C#中的字数

本文关键字:计算 | 更新日期: 2023-09-27 18:19:44

我正在尝试计算C#中一个富文本框中的单词数,下面的代码只有在它是单行的情况下才有效。如何在不依赖regex或任何其他特殊函数的情况下做到这一点。

string whole_text = richTextBox1.Text;
string trimmed_text = whole_text.Trim();
string[] split_text = trimmed_text.Split(' ');
int space_count = 0;
string new_text = "";
foreach(string av in split_text)
{
    if (av == "")
    {
        space_count++;
    }
    else 
    { 
        new_text = new_text  + av + ",";
    }
}
new_text = new_text.TrimEnd(',');
split_text = new_text.Split(',');
MessageBox.Show(split_text.Length.ToString ());

计算C#中的字数

char[] delimiters = new char[] {' ', ''r', ''n' };
whole_text.Split(delimiters,StringSplitOptions.RemoveEmptyEntries).Length;  

由于您只对字数感兴趣,而不关心单个单词,因此可以避免String.SplitString.Split很方便,但它不必要地生成(可能)大量的String对象,这反过来又给垃圾收集器带来了不必要的负担。对于文本中的每个单词,都需要实例化一个新的String对象,然后很快收集,因为您没有使用它

对于家庭作业,这可能无关紧要,但如果您的文本框内容经常更改,并且您在事件处理程序中进行计算,那么手动迭代字符可能更明智。如果你真的想使用String.Split,那么就选择Yonix推荐的更简单的版本。

否则,使用类似的算法:

int wordCount = 0, index = 0;
// skip whitespace until first word
while (index < text.Length && char.IsWhiteSpace(text[index]))
    index++;
while (index < text.Length)
{
    // check if current char is part of a word
    while (index < text.Length && !char.IsWhiteSpace(text[index]))
        index++;
    wordCount++;
    // skip whitespace until next word
    while (index < text.Length && char.IsWhiteSpace(text[index]))
        index++;
}

如果每个单词之间有多个空格,则此代码应该能更好地工作,您可以在线测试代码。

有一些更好的方法可以做到这一点,但为了与您现有的方法保持一致,请尝试以下方法:

string whole_text = richTextBox1.Text;
string trimmed_text = whole_text.Trim();
// new line split here
string[] lines = trimmed_text.Split(Environment.NewLine.ToCharArray());
// don't need this here now...            
//string[] split_text = trimmed_text.Split(' ');
int space_count = 0;
string new_text = "";

现在做两个前臂环。每行一个,行内单词计数一个。

foreach (string line in lines)
{
    // Modify the inner foreach to do the split on ' ' here
    // instead of split_text
    foreach (string av in line.Split(' '))
    {
        if (av == "")
        {
            space_count++;
        }
        else
        {
            new_text = new_text + av + ",";
        }
    }
}
new_text = new_text.TrimEnd(',');
// use lines here instead of split_text
lines = new_text.Split(',');
MessageBox.Show(lines.Length.ToString());
}

这是我刚刚接受的一个电话筛选面试问题(由位于加利福尼亚州的一家大公司提出,该公司销售以字母"I"开头的各种设备),我想我已经坦白了。。。离线后,我写了这个。我希望我能在面试时做到。。

static void Main(string[] args)
{
    Debug.Assert(CountWords("Hello world") == 2);
    Debug.Assert(CountWords("    Hello world") == 2);
    Debug.Assert(CountWords("Hello world    ") == 2);
    Debug.Assert(CountWords("Hello      world") == 2);
}
public static int CountWords(string test)
{
    int count = 0;
    bool wasInWord = false;
    bool inWord = false;
    for (int i = 0; i < test.Length; i++)
    {
        if (inWord)
        {
            wasInWord = true;
        }
        if (Char.IsWhiteSpace(test[i]))
        {
            if (wasInWord)
            {
                count++;
                wasInWord = false;
            }
            inWord = false;
        }
        else
        {
            inWord = true;
        }
    }
    // Check to see if we got out with seeing a word
    if (wasInWord)
    {
        count++;
    }
    return count;
}

看看@Jay Riggs评论中提到的Lines属性,以及这个String重载。拆分使代码更简单。然后,最简单的方法是在Lines属性中的每一行上循环,对其调用String.Split,并将其返回的数组长度添加到运行计数中。

编辑:还有,你使用RichTextBox而不是Multiline设置为True的TextBox有什么原因吗?

我使用一个扩展方法来获取字符串中的字数。但是,请注意,双空格会打乱计数。

    public static int CountWords(this string line)
    {
        var wordCount = 0;
        for (var i = 0; i < line.Length; i++)
            if (line[i] == ' ' || i == line.Length - 1)
                wordCount++;
        return wordCount;
    }
}

您的方法是正确的。我会做一些类似的事情,将richTextBox1的text属性传递到方法中。然而,如果你的富文本框正在格式化HTML,这将是不准确的,所以你需要在运行字数计数之前去掉任何HTML标签:

public static int CountWords(string s)
    {
    int c = 0;
    for (int i = 1; i < s.Length; i++)
    {
        if (char.IsWhiteSpace(s[i - 1]) == true)
        {
        if (char.IsLetterOrDigit(s[i]) == true ||
            char.IsPunctuation(s[i]))
        {
            c++;
        }
        }
    }
    if (s.Length > 2)
    {
        c++;
    }
    return c;
}

我们使用了Yoshi答案的改编形式,修复了如果后面没有空格,它就不会计算字符串中的最后一个单词的错误:

public static int CountWords(string test)
{
  int count = 0;
  bool inWord = false;
  foreach (char t in test)
  {
    if (char.IsWhiteSpace(t))
    {
      inWord = false;
    }
    else
    {
      if (!inWord) count++;
      inWord = true;
    }
  }
  return count;
}
using System.Collections;
using System;
class Program{
public static void Main(string[] args){
        //Enter the value of n
        int n = Convert.ToInt32(Console.ReadLine());
        string[] s = new string[n];
        ArrayList arr = new ArrayList();
        //enter the elements
        for(int i=0;i<n;i++){
            s[i] = Console.ReadLine();
        }
        string str = "";
        //Filter out duplicate values and store in arr
        foreach(string i in s){
            
            if(str.Contains(i)){
  
                }else{
                    arr.Add(i);
                }
                str += i;
        }
        //Count the string with arr and s variables
        foreach(string i in arr){
            int count = 0;
            foreach(string j in s){
                if(i.Equals(j)){
                    count++;
                }
            }
            Console.WriteLine(i+" - "+count);
        }
    }
}

这是我的解决方案:

int wordCount = 0;
bool previousLetterWasWhiteSpace = false;
foreach (char letter in keyword)
{
    if (char.IsWhiteSpace(letter))
    {
        previousLetterWasWhiteSpace = true;
    }
    else
    {
        if (previousLetterWasWhiteSpace)
        {
            previousLetterWasWhiteSpace = false;
            wordCount++;
        }
    }
}

这是我在尽可能高效的同时对字符串中的单词进行计数的尝试。使用Span确保没有分配。

    public static int WordCount(this string s)
    {
        ReadOnlySpan<char> span = s.AsSpan();
        int wordCount = 0;
        while (!span.IsEmpty)
        {
            while (!span.IsEmpty && char.IsWhiteSpace(span[0]))
                span = span.Slice(1);
            if (!span.IsEmpty)
                wordCount++;
            while (!span.IsEmpty && !char.IsWhiteSpace(span[0]))
                span = span.Slice(1);
        }
        return wordCount;
    }

测试:

            Assert.True("".WordCount() == 0);
            Assert.Equal(1, "hello".WordCount());
            Assert.Equal(2, "hello world".WordCount());
            Assert.Equal(3, "hello world test".WordCount());
            Assert.Equal(4, "hello world test test".WordCount());
            // sentence with punctuation
            Assert.Equal(4, "hello world, test test.".WordCount());
            // multiple sentences
            Assert.Equal(6, "hello world. test test. Hello there.".WordCount());
            // spaces before and after
            Assert.Equal(4, " hello world. test test ".WordCount());
            Assert.Equal(4, "    hello world.   test test       ".WordCount());
public static int WordCount(string str)
{        
    int num=0;
    bool wasInaWord=true;;
    if (string.IsNullOrEmpty(str))
    {
        return num;
    }
    for (int i=0;i< str.Length;i++)
    {
        if (i!=0)
        {
            if (str[i]==' ' && str[i-1]!=' ')
            {
                num++;
                wasInaWord=false;
            }
        } 
            if (str[i]!=' ')
            {
                wasInaWord=true;                
            }
    }
    if (wasInaWord)
    {
        num++;
    }
    return num;
}
class Program
 {
    static void Main(string[] args)
    {
        string str;
        int i, wrd, l;
        StringBuilder sb = new StringBuilder();
        Console.Write("'n'nCount the total number of words in a string 
        :'n");
        Console.Write("--------------------------------------------------- 
        ---'n");
        Console.Write("Input the string : ");
        str = Console.ReadLine();
        l = 0;
        wrd = 1;
        foreach (var a in str)
        {
            sb.Append(a);
            if (str[l] == ' ' || str[l] == ''n' || str[l] == ''t')
            {
                wrd++;
            }
            l++;
        }
        Console.WriteLine(sb.Replace(' ', ''n'));
        Console.Write("Total number of words in the string is : {0}'n", 
        wrd);
        Console.ReadLine();
 }

这应该能在中工作

input.Split(' ').ToList().Count;

这可以显示一行中的字数

string line = Console.ReadLine();
string[] word = line.Split(' ');
Console.WriteLine("Words " + word.Length);

您也可以用这种方式!!将此方法添加到扩展方法中。

   public static int WordsCount(this string str)
    {
        return Regex.Matches(str, @"(('w+('s?)))").Count;
    }

并这样称呼它。

  string someString = "Let me show how I do it!";
  int wc = someString.WordsCount();