如何计数带有x个元音的单词和行C#多行文本框Windows窗体
本文关键字:文本 窗体 Windows 单词 何计数 | 更新日期: 2023-09-27 18:27:34
到目前为止,我只能计算元音的数量,但不能计算每个单词的数量。我还可以数出只有一个单词的行数。我真正需要帮助的是计算只有一定数量元音的单词。我还需要能够计算出带有一定数量元音的行。这是我到目前为止的代码:
private void button1_Click(object sender, EventArgs e)
{
string word = textBox1.Text;
int count = 0;
// int vowelCount = 0;
foreach (char vowel in word)
{
if (vowel == 'a' || vowel == 'A' || vowel == 'e' || vowel == 'E' || vowel == 'i' || vowel == 'I' || vowel == 'o' || vowel == 'O' || vowel == 'u' || vowel == 'U')
{
count++;
}
}
int lineCount = 0;
LineCountlbl.Text = lineCount.ToString();
LineCountlbl.Text = word.Split(new char[] { ''n', ''r' }, StringSplitOptions.RemoveEmptyEntries).Length.ToString();
}
查找每两行有3个或更多元音的单词预期输出:
- 不可分割,人人享有自由和正义
- 立正,右手面向国旗
- 心脏。当不穿制服时,男人应该脱掉任何不信教的衣服
- 用右手戴上头饰,并将其握在左侧肩膀
单词元音计数:3行:2
给定一个字符串input
,可以按如下方式使用String.Split
将其分隔为单独的单词。
var Words
= input.Split(new char[] { Environment.EndLine }, StringSplitOptions.RemoveEmptyEntries);
进一步,您可以使用Linq如下所示将单个字符串映射到其元音数量。
var Vowels = "aeiou";
Func<string,int> NumOfVowels
= iString => iString.ToLower().Count( iChar => Vowels.Contains( iChar ) );
var NumberOfVowelsPerWord = input.Select( NumOfVowels );
如果最后n
是给定数量的元音,则input
中具有恰好n
元音的单词数量可以如下获得。
int Count = input.Select( NumOfVowels ).Count( iInt => iInt == n );
这里有一个完整的例子,在我的代码中有详细的注释。
var myText = new []
{
"My name is Orel Eraki and i love snooker",
"I also enjoy Hiking and visiting different cultures."
};
const string vowels = "aeiou";
int minVowelsPerLine = 3;
int minVowelsPerWord = 2;
int numberOfLinesWithMoreThanXVowels = 0;
foreach (var line in myText)
{
// Lowering entire line, to simplify the equality check.
string workingLine = line.ToLower();
// Splitting words into array for working on each word in array separately.
var wordsInALine = workingLine.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
// Counting the characters on each word if they appears(contains) in the 'vowels' array
// and eventually seeing if the number of each 'vowles' in word is at least 'minVowelsPerWord' amount.
int numberOfWordsWithAtLeastXVowels = wordsInALine.Count(word => word.ToLower().Count(c => vowels.Contains(c)) > minVowelsPerWord);
// Counting the entire 'vowles' inside a line.
int numberOfVowlesInLine = workingLine.Count(c => vowels.Contains(c));
if (numberOfVowlesInLine > minVowelsPerLine)
{
numberOfLinesWithMoreThanXVowels++;
}
Console.WriteLine("Line[{0}] has {1} words with at least {2} vowles in them.", line, numberOfLinesWithMoreThanXVowels, minVowelsPerWord);
}
Console.WriteLine("Text has {0} lines with at least {1} vowles in them.", numberOfLinesWithMoreThanXVowels, minVowelsPerLine);
好的,假设我们有一些文本:
string input = "here is some text'nthat breaks over'nmultiple lines'nand we are going'nto count the vowels";
我们需要做的第一件事是把它分成几行:
var lines = input.Split(''n');
现在lines
是一个行数组。
现在我们将遍历每一行,每一行我们都会得到单词的数量:
foreach (var line in lines)
{
// Get words
var words = line.Split(' ');
// ...
}
我们假设单词之间没有多个空格,但如果这成为一个问题,就不难处理(例如,可以使用Regex.Split
)。
现在,在这个循环中,您可以循环words
并测试每个单词。有几种方法可以计算它们,我将使用正则表达式:
var vowels = var vowels = new Regex("[aeiou]", RegexOptions.IgnoreCase);
foreach (var line in lines)
{
// Get words
var words = line.Split(' ');
foreach (var word in words)
{
var vowelCount = vowels.Matches(word).Count;
}
}
当然,使用LINQ有更紧凑的方法可以做到这一点,但这应该为您提供如何思考问题的基本概述。一旦你有了每个单词的元音数量,你就可以做任何你需要的事情,计算只有一定元音数量的单词,或者计算有一定元音总数的行,或者你需要做的任何事情(你的问题不完全清楚你真正需要什么来输出)。
编辑:因此,根据现在编辑的问题,您可以执行以下操作:
var vowels = var vowels = new Regex("[aeiou]", RegexOptions.IgnoreCase);
var lineCount = 0;
var wordCount = 0;
foreach (var line in lines)
{
bool hasThreeVowelWord = false;
// Get words
var words = line.Split(' ');
foreach (var word in words)
{
var vowelCount = vowels.Matches(word).Count;
if (vowelCount == 3)
{
wordCount++;
hasThreeVowelWord = true;
}
}
if (hasThreeVowelWord) { lineCount++; }
}
现在lineCount
是包含至少一个具有三个元音的单词的行数,wordCount
是具有三个韵母的单词的数。