计算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 ());
char[] delimiters = new char[] {' ', ''r', ''n' };
whole_text.Split(delimiters,StringSplitOptions.RemoveEmptyEntries).Length;
由于您只对字数感兴趣,而不关心单个单词,因此可以避免String.Split
。String.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();