【问题标题】:Counting vowels in a string c# [duplicate]计算字符串中的元音c#[重复]
【发布时间】:2016-12-22 07:29:38
【问题描述】:

我正在制作一个程序来分析用户输入句子的特征。为了计算句子中的元音,我在这里做了一个非常混乱的 foreach 循环序列:

foreach (char v1 in input)
{
    if (v1 == 'a')
    {
        vcounter++;
    }
}
foreach (char v2 in input)
{
    if (v2 == 'e')
    {
        vcounter++;
    }
}
foreach (char v3 in input)
{
    if (v3 == 'i')
    {
        vcounter++;
    }
}
foreach (char v4 in input)
{
    if (v4 == 'o')
    {
        vcounter++;
    }
}
foreach (char v5 in input)
{
    if (v5 == 'u')
    {
        vcounter++;
    }
}

然后我获取 vcounter 并将其显示为结果。我对 c# 很陌生,我想知道是否有人可以提出更好的方法?

【问题讨论】:

  • 提示:考虑一本字典

标签: c#


【解决方案1】:

将元音存储在这样的数组中:

private readonly char[] vowels = new char[] { 'a', 'e', 'i', 'o', 'u' };

然后数一数:

public int CountVowels(string text)
{
    return text.ToLower().Count(x => vowels.Contains(x));
}

【讨论】:

  • 如果你创建一个HashSet而不是一个数组,它会更快:)包含在数组中真的是全扫描。
  • @IlyaChernomordik 进行小型集全扫描实际上可能更快。无论如何,这是一个微优化。 ;-)
【解决方案2】:

如果您使用的是 .NET 3.5 或更高版本,您可以为此使用 LINQ。

vcounter += input.Count(v => v == 'a');
vcounter += input.Count(v => v == 'e');
vcounter += input.Count(v => v == 'i');
vcounter += input.Count(v => v == 'o');
vcounter += input.Count(v => v == 'u');

为此,您必须在文档中导入 LINQ。

using System.Linq;

【讨论】:

    【解决方案3】:

    你可以试试下面的代码:

    const string vowels = "aeiou";
    var count = input.Count(chr => vowels.Contains(char.ToLower(chr)));
    

    或

    for (int i = 0; i < input.Length; i++)
        {
            if (input[i]  == 'a' || input[i] == 'e' || input[i] == 'i' || input[i] == 'o' || input[i] == 'u')
            {
                count++;
            }
        }
    

    【讨论】:

      【解决方案4】:

      将元音存储在列表中:

      List<Char> vowels = new List<char>() { 'a', 'e', 'i', 'o', 'u' };
      

      然后这样算:

      int vcounter = 0;
      foreach (char chr in input)
      {
         if (vowels.Contains(chr))
         {
             vcounter++;
         }
      }
      

      【讨论】:

        【解决方案5】:

        试试这个:

        var text = "hfdaa732ibgedsoju";
        var vowels = new[] { 'a', 'e', 'i', 'o', 'u' };
        var vowelFrequency = text.Where(c => vowels.Contains(c))
                                 .GroupBy(c => c)
                                 .ToDictionary(g => g.Key, g.Value.Count());
        

        将创建一个类似于 Maksim 的答案的字典,但只有元音。

        使用vowelFrequency.Sum(vf =&gt; vf.Value) 获取字符串中元音的总数。

        【讨论】:

          【解决方案6】:

          您可以在此功能中进行维护。我创建了一个包含一些字母的数组。

           private void button1_Click(object sender, EventArgs e)
                  {
                      string [] array = { "a", "b", "c", "d" };
                      int vcounter = 0;
                      foreach (var item in array)
                      {
                          if (item.Contains("a") || item.Contains("e") || item.Contains("i")) //You can add the other volwes 
                          {
                              vcounter++;
                          }
                      }
                      MessageBox.Show("Count of vowels : " + vcounter.ToString());
                  }
          

          【讨论】:

            【解决方案7】:

            效率不高,但时间短

            using System.Text.RegularExpressions;
            
            // ...
            
            var vcounter = Regex.Matches(input, "[aeiou]", RegexOptions.IgnoreCase).Count;
            

            【讨论】:

              【解决方案8】:

              你可以只使用正则表达式:

              vcounter = Regex.Matches(input, "a|e|i|o|u", RegexOptions.IgnoreCase).Count;
              

              【讨论】:

              • 您不需要转义输入。仅当您尝试将普通字符串转换为匹配表达式时。
              • 好点!我已经更新了答案。
              猜你喜欢
              • 1970-01-01
              • 2020-10-02
              • 1970-01-01
              • 1970-01-01
              • 2013-11-26
              • 2021-11-09
              • 2018-04-30
              • 2020-02-19
              • 2011-09-05
              相关资源
              最近更新 更多