2012-12-19 118 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);