根据字数过滤字符串

时间:2012-12-19 07:39:35

标签: c# list ienumerable word-count charactercount

我正在尝试根据每个字符串中的单词数过滤字符串列表。我假设您将修剪字符串末尾的任何空格,然后计算字符串中剩余的空格数,以便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();
}

有关计算单词的想法吗?

更新:这就像一个魅力...感谢Mathew:

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();

4 个答案:

答案 0 :(得分:8)

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

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;
    }

答案 1 :(得分:3)

你计算单词是好的。 String.Split会为更多内存使用提供类似的结果。

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

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

答案 2 :(得分:1)

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

s.Split().Count()

删除了空格:)

答案 3 :(得分:1)

您希望所有字符串在给定范围内具有字数吗?

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);