Точка с запятой в конце, если (a == b); просто закончить оператор в одной строке, что означает игнорировать результат условия и продолжить выполнение из следующей строки. Этот код полезен, с другой стороны, когда-то вводит ошибку в программу, например, случай 1. a = 5; b = 3; если (a == b); prinf («a и b равны»); случай 2. a = 5; b = 5; если (a == b); prinf («a и b равны»); будет печатать тот же результат на экране ...
Поскольку вас интересует только количество слов, и вас не интересуют отдельные слова, String.Split
можно было бы избежать. String.Split
удобен, но он излишне генерирует (потенциально) большое количество объектов String
, что, в свою очередь, создает ненужную нагрузку на сборщик мусора. Для каждого слова в вашем тексте необходимо создать экземпляр нового объекта String
, а затем скоро его собрать, так как вы его не используете.
Для домашнего задания это может не иметь значения, но если ваш текст содержимое ящика меняется часто, и вы делаете это вычисление внутри обработчика события, может быть разумнее просто перебирать символы вручную. Если вы действительно хотите использовать String.Split
, перейдите к более простой версии, например Yonix .
В противном случае используйте алгоритм, подобный этому:
var text = richTextBox1.Text.Trim();
int wordCount = 0, index = 0;
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++;
}
Этот код должен работать лучше, если у вас есть несколько пробелов между каждым словом.
Вы также можете сделать это таким образом! Добавьте этот метод к вашим методам расширения.
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();
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;
}
char[] delimiters = new char[] {' ', '\r', '\n' };
whole_text.Split(delimiters,StringSplitOptions.RemoveEmptyEntries).Length;
RemoveEmptyEntries
. Это имеет значение, если в строке есть несколько пробельных символов.
– Groo
9 January 2012 в 08:46
Есть несколько лучших способов сделать это, но в соответствии с тем, что у вас есть, попробуйте следующее:
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. Один для каждой строки и один для подсчета слов внутри строк.
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());
}
Ваш подход находится на правильном пути. Я бы сделал что-то вроде передачи свойства text richTextBox1 в метод. Это, однако, будет неточным, если ваш богатый текстовый поле форматирует 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;
}
Посмотрите на свойство Lines
, указанное в комментарии @Jay Riggs, а также эту перегрузку String.Split , чтобы сделать код намного проще. Тогда самым простым подходом было бы перебрать каждую строку в свойстве Lines
, называть String.Split
на нем и добавить длину массива, который он возвращает, к текущему счету.
EDIT: Кроме того, есть ли причина, по которой вы используете RichTextBox вместо TextBox с Multiline
, установленным на True
?
Это должно работать
input.Split(' ').ToList().Count;
Мы использовали адаптированную форму ответа Йоши, где мы исправили ошибку, где она не учитывала бы последнее слово в строке, если после него не было белого пробела:
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;
}
Это был вопрос интервью с экраном, который я только что взял (крупной компанией, расположенной в ЦА, которая продает все виды устройств, которые начинаются с буквы «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;
}