2012-12-19 117 views
5

我想根据每个字符串中的字数来过滤字符串列表。我假设你会修剪字符串末尾的任何空格,然后计算字符串中留下的空格的数量,以便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(); 
} 

计算单词的任何想法?

UPDATE:这工作就像一个魅力...谢谢马修:

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

回答

8

我想接近它以更简单的方式,因为你已经表明,一个空间可以可靠地像这样分隔符可以使用:

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

编辑:

如果最佳perforamnce是必要的和内存使用情况是,你可以令状关注Ë你自己的方法,并利用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; 
    } 
+0

谢谢马修...以下工作就像一个魅力! – Jeagr

+0

int minWords = int.Parse(numeric_MinWords.Text); int maxWords = int.Parse(numeric_MaxWords.Text); (x)> x.Trim()。Split(new char [] {''},StringSplitOptions.RemoveEmptyEntries).Count()> = minWords && x.Trim()。Split(new char [] {''},StringSplitOptions.RemoveEmptyEntries).Count()<= maxWords).ToList(); – Jeagr

+0

是一种比使用LINQ查询更高效的方法吗? – Jeagr

1

如何分割字符串数组使用空间和计数?

s.Split().Count() 

删除的空间:)

+0

添加RemoveEmptyEntries,因为在马修的答案会idd会更好:) – ufosnowcat

+1

没有必要使用''“ ',只需使用'string.Split()'而不带参数(或null),'Split'使用空格字符作为分隔符。 –

3

你的方法来计算的话就可以了。 String.Split会给出更多内存使用情况的相似结果。

不仅仅是实现你int WordCount(string text)功能,并把它传递到哪里:

myList.Where(s => WordCount(s) > minWordCount) 
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);