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

EDIT:

最適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); splitBox1.Where(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

Matthewの答えでRemoveEmptyEntriesを追加すると、iddはもっと良いでしょう:) – ufosnowcat

+1

'" " '、引数なしで' string.Split() 'を使うだけで、' Split'は空白文字を区切り文字とみなします。 –

3

okです。 String.Splitは、メモリ使用量を増やしても同様の結果が得られます。

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

あなたが与えられた範囲内の単語数を持つすべての文字列をしたい:ちょうどあなたのint WordCount(string text)機能を実装し、どこにそれを渡したより

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); 
関連する問題