【问题标题】:Counting words in each sentence using C#使用 C# 计算每个句子中的单词
【发布时间】:2015-01-03 20:12:09
【问题描述】:

我需要创建一个程序来显示一个包含最多单词的句子。

string [] st = { "I like apples.", 
                 "I like red apples.", 
                 "I like red apples than green apples." 
};

foreach (string s in st)
{
    int NumberOfWords = s.Split(' ').Length;
}

结果应该显示“我喜欢红苹果而不是青苹果”。

【问题讨论】:

  • 你试过什么?展示一些东西(任何东西),即使它不起作用,所以这里有人可以帮助你改进它。
  • 最好的起点是将问题分解为更小的子问题。然后独立处理每个子问题。
  • 使用 string.split() 很容易做到这一点。您应该向我们展示您尝试过的东西,以便我们可以帮助解决特定问题。该网站不是请为我编码的网站类型。
  • 大家好,我已经添加了我的代码......

标签: c# winforms word-count


【解决方案1】:

您的表单中可能有不同TextBox 控件中的句子。让您知道哪个句子中有更多的单词;按空格分割句子并计算单词数,然后您可以进行比较。如下所示。

int str1 = "I like apples".Split(' ').Length;
int str2 = "I like red apples".Split(' ').Length;
int str3 = "I like red apples than green apples".Split(' ').Length;

这里split() 函数返回一个字符串数组,所以你可以得到它的Length。现在您可以轻松地比较它们了。

编辑:

下面是在您发布的代码上绘制的完整示例代码。将字数存储在 int[] 数组中。然后对数组进行排序。显然,下面arr 中的最后一个元素将是具有最高单词的元素。

    static void Main(string[] args)
    {
        int[] arr = new int[3];           
        string[] st = { "I like apples.", "I like red apples.", 
                             "I like red apples than green apples." };
        int counter = 0;
        foreach (string s in st)
        {
            int NumberOfWords = s.Split(' ').Length;
            arr[counter] = NumberOfWords;
            counter++;
        }

        Array.Sort(arr);

        Console.WriteLine(st[arr.Length - 1]);
    }

【讨论】:

  • 谢谢拉胡尔!将尽快回复您!但是......也许这听起来很傻,但可以在标签中显示结果?反正会试试的~
  • 是的,只需将其附加到标签Text 属性上,例如this.label1.Text = st[arr.Length - 1]
  • 谢谢拉胡尔!我不能感谢你!效果很好!而且您的代码不难理解!再次感谢您的帮助~
【解决方案2】:
var result = st
    .OrderByDescending(s => s.Split(' ').Count())
    .First();

【讨论】:

  • 嗨 Mihai,感谢您的解决方案,但我缺乏 C# 知识,无法识别 C# 中“var”的含义...(我在 javascript 中看到过)我看到过 OrderByDescending 和它看起来很方便的解决方案,但我无法用部分代码对其进行测试....我只能责怪自己....但是感谢您的代码:)我将来也许可以使用它~
  • @user3601310,哦,你可以把上面例子中的var换成stringvar 意味着您的编译器将根据右侧的内容为您推断变量的类型(这里First() 将从按长度排序的字符串序列中返回第一个string)。所以返回类型将是字符串。如果您将鼠标悬停在 result 变量上,您会看到它被解释为字符串。
  • 嗨,Mihai,看起来它会工作,但我在 s 下遇到错误,很抱歉,但不知道如何显示它... string[] st = { "我喜欢苹果。我喜欢红苹果。比起青苹果,我更喜欢红苹果。” }; foreach (st 中的字符串 s) { 字符串结果 = st.OrderByDescending(s => s.Length).First(); } this.label1.Text = st.ToString();
  • 嗨,米海!谢谢,效果很好!获得相同结果的方法有很多,您的方法更容易!感谢您在我的问题上花费的时间〜但我没有得到 s...我们没有声明 s 但它工作正常...这是我的代码:string[] st = {“我喜欢苹果.", "我喜欢红苹果。", "我喜欢红苹果胜过青苹果。" };字符串结果 = st.OrderByDescending(s => s.Length).First(); this.label1.Text = 结果;
  • @user3601310,据我了解,您希望this.label1.Text 包含st 中最长的字符串。你不需要foreach。你只需要我在回复中写的结果,然后是this.label1.Text = result。就是这样。
【解决方案3】:

这是一个使用 Linq 的快速单行代码:

return st.Select(s => s.Split(' ')).OrderByDescending(a => a.Length).First().Aggregate((s, next) => s + " " + next);

所以本质上我们需要 4 个单独的操作,并使用 Linq 将它们变成一个语句。

  1. 将字符串数组转换为字符串数组的枚举,其中每个字符串现在都是在空格字符上分割的数组。
  2. 按每个数组的长度(字数)以降序(最大或最长,在前)对(数组中的)数组进行排序。
  3. 选择第一个数组(最长的)。
  4. 获取数组(将原始字符串分解为单词数组)并将其重新组合成一个字符串。

在一个类中,这可能看起来像:

public string LongestString(params string[] args)
{
        return args.Select(s => s.Split(' ')).OrderByDescending(a => a.Length).FirstOrDefault().Aggregate((s, next) => s + " " + next);
}

您需要通过包含“using System.Linq;”来确保包含 Linq 命名空间。在文件的顶部(如果还没有的话)。

【讨论】:

  • 嗨,Zachary,伙计……我希望我能理解 Linq……我可以使用 C# 创建一个简单的数据库驱动网站(所以我以为我对 C# 有一点了解)但我可以'甚至不做这样的简单程序(被认为很简单,但对我来说没有办法......)......感谢您的逐步解释以及您编写解决方案所花费的时间!
  • 乐于助人;不可能什么都知道。一旦我对 lambdas 感到满意,Linq 就成了我最好的朋友;它使处理数组和枚举(集合、列表)变得更容易、更干净、更快捷。下次您需要针对数组或对象枚举执行任何逻辑时,绝对值得一试。 =D
【解决方案4】:

如果您阅读其记录的摘要,您的代码非常好,那么您将看到s.Split() 将返回包含指定字符的substring。但如果它是空的,那么你会得到字数。所以你可以把它当作:

int NumberOfWords = s.Split().Length;

请分享结果。

编辑: 在你的循环声明一个整数之前

int largest = 0;

然后在你的循环中编写代码

int NumberOfWords = s.Split().Length;
if(NumberOfWords > largest)
{
   this.label1.Text = s;
   largest = NumberOfWords;
}

这样,您将在LabelText 中获得带有大字的字符串

【讨论】:

  • 嗨,Ammar,感谢您的解决方案,但我无法显示结果...我使用了 this.label1.Text = st.ToString();正如其他用户建议的那样,但它显示了系统问题...我缺乏 C# 知识正在杀死我....但是感谢您的宝贵时间~
  • 请在我编辑解决方案后查看详细信息。
  • 嗨,阿马尔!效果很好!感谢您的解决方案和您的友好解释:)
【解决方案5】:

您可以使用Regex.Matches() 来获取单词的数量,如下例所示:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
    const string t1 = "To be or not to be, that is the question.";
    Console.WriteLine(WordCounting.CountWords1(t1));

    const string t2 = "Mary had a little lamb.";
    Console.WriteLine(WordCounting.CountWords1(t2));
    }
}

/// <summary>
/// Contains methods for counting words.
/// </summary>
public static class WordCounting
{
    /// <summary>
    /// Count words with Regex.
    /// </summary>
    public static int CountWords1(string s)
    {
        MatchCollection collection = Regex.Matches(s, @"[\S]+");
        return collection.Count;
    }

}

【讨论】:

    【解决方案6】:

    这应该可以工作

    var text = @"This is some random text for testing";
    var counts = text
        .Where(c => char.IsLetter(c)) // Make sure it's only a letter
        .Select(c => char.ToUpper(c)) // uppercase it
        .GroupBy(c => c) // Group the letters
        .Select(g => new 
        {
            Character = g.Key, 
            Count = g.Count(),
        }) // Select into char and count to make accessing easier
        .OrderBy(x => x.Character); // Order alphabetically
        
    foreach (var c in counts)
    {
        Console.WriteLine($"Letter: {c.Character}\t Count: {c.Count}");
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多