如何计数带有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个或更多元音的单词预期输出:

  1. 不可分割,人人享有自由和正义
  2. 立正,右手面向国旗
  3. 心脏。当不穿制服时,男人应该脱掉任何不信教的衣服
  4. 用右手戴上头饰,并将其握在左侧肩膀

单词元音计数:3行:2

如何计数带有x个元音的单词和行C#多行文本框Windows窗体

给定一个字符串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是具有三个韵母的单词的数。