【问题标题】:Filtering a String based on word count根据字数过滤字符串
【发布时间】:2012-12-06 12:33:18
【问题描述】:

我正在尝试根据每个字符串中的单词数过滤字符串列表。我假设您将修剪字符串末尾的任何空白,然后计算字符串中剩余的空格数,这样 WordCount = NumberOfSpaces + 1。这是最有效的方法吗?我知道对于基于字符数的过滤,以下工作正常......只是无法弄清楚如何使用 C#/LINQ 简洁地编写它。

if (checkBox_MinMaxChars.Checked)
{
    int minChar = int.Parse(numeric_MinChars.Text);
    int maxChar = int.Parse(numeric_MaxChars.Text);

    myList = myList.Where(x => 
                              x.Length >= minChar && 
                              x.Length <= maxChar).ToList();
}

对单词计数有什么想法吗?

更新:这就像一个魅力......谢谢马修:

int minWords = int.Parse(numeric_MinWords.Text);
int maxWords = int.Parse(numeric_MaxWords.Text);

sortBox1 = sortBox1.Where(x => x.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count() >= minWords &&
                               x.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count() <= maxWords).ToList();

【问题讨论】:

    标签: c# list ienumerable word-count charactercount


    【解决方案1】:

    我会以更简化的方式处理它,因为您已经指出可以像这样可靠地使用空格作为分隔符:

    var str = "     the string to split and count        ";
    var wordCount = str.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count();
    

    编辑:

    如果需要最佳性能并且内存使用是一个问题,您可以编写自己的方法并利用IndexOf()(尽管有很多方法可以解决这样的问题,但我更喜欢重用而不是从头开始代码设计):

        public int WordCount(string s) {
            const int DONE = -1;
            var wordCount = 0;
            var index = 0;
            var str = s.Trim();
            while (index != DONE) {
                wordCount++;
                index = str.IndexOf(" ", index + 1);
            }
            return wordCount;
        }
    

    【讨论】:

    • int minWords = int.Parse(numeric_MinWords.Text); int maxWords = int.Parse(numeric_MaxWords.Text); sortBox1 = sortBox1.Where(x => x.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count() >= minWords && x.Trim().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Count()
    • 这样的方法比使用 LINQ 查询更有效吗?
    • 一般来说,LINQ 的开销比这样的多。您必须记住,在幕后,LINQ 只是获取您的谓词函数并在美化的 foreach 循环中使用它们。你会看到多少性能提升......很大程度上取决于问题。
    【解决方案2】:

    如何使用空格将字符串拆分为数组并对其进行计数?

    s.Split().Count()
    

    删除空间:)

    【讨论】:

    • 在马修的回答中添加 RemoveEmptyEntries 会更好:)
    • 不需要使用" ",只需使用不带参数(或null)的string.Split()Split 假定空格字符作为分隔符。
    【解决方案3】:

    你计算单词的方法没问题。 String.Split 会为更多的内存使用提供类似的结果。

    不仅仅是实现您的int WordCount(string text) 函数并将其传递给Where:

    myList.Where(s => WordCount(s) > minWordCount)
    

    【讨论】:

      【解决方案4】:

      您想要所有字数在给定范围内的字符串吗?

      int minCount = 10;
      int maxCount = 15;
      IEnumerable<string> result = list
          .Select(String => new { String, Words = String.Split() })
          .Where(x => x.Words.Length >= minCount
                   && x.Words.Length <= maxCount)
          .Select(x => x.String);
      

      【讨论】:

        猜你喜欢
        • 2013-11-25
        • 2021-03-18
        • 1970-01-01
        • 1970-01-01
        • 2019-02-04
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多