2012-12-19 22 views
5

Sto tentando di filtrare un elenco di stringhe in base al numero di parole in ogni stringa. Suppongo che si possa ritagliare qualsiasi spazio bianco all'estremità della stringa e quindi contare il numero di spazi rimasti nella stringa, in modo che WordCount = NumberOfSpaces + 1. sia il modo più efficiente per farlo? So che per il filtraggio basato sul conteggio dei caratteri il seguente funziona bene ... non riesco a capire come scriverlo in modo succinto usando C#/LINQ.Filtraggio di una stringa in base al numero di parole

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

Qualche idea di conteggio parole?

UPDATE: Il tutto ha funzionato come un fascino ... Grazie 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(); 

risposta

8

vorrei affrontarlo in maniera più semplificata dal momento che avete indicato che uno spazio può essere utilizzato in modo affidabile come delimitatore in questo modo:

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

EDIT:

Se perforamnce ottimale è necessario e utilizzo della memoria è una preoccupazione si potrebbe scritto e il proprio metodo e la leva IndexOf() (anche se ci sono molte strade per l'implementazione su un problema come questo, ho appena preferisco riutilizzo piuttosto che da-zero codice di progettazione):

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

Grazie Mathew ... Il seguente ha funzionato come un fascino! – Jeagr

+0

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

+0

Un metodo del genere è più efficiente dell'utilizzo delle query LINQ? – Jeagr

1

come circa dividere la stringa in un array usando spazio e contando?

s.Split().Count() 

rimosso lo spazio :)

+0

aggiungendo RemoveEmptyEntries come nella risposta di matthew sarebbe idd essere meglio :) – ufosnowcat

+1

Non c'è bisogno di usare '" " ', usa semplicemente' stringa.Split() 'senza argomenti (o null) e' Split' assume i caratteri dello spazio bianco come separatori. –

3

Ti avvicini al conteggio parole è ok. String.Split darà risultati simili per un maggiore utilizzo della memoria.

di un semplice implementare la funzione int WordCount(string text) e passarlo a Dove:

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

Volete tutte le stringhe con la parola-count in un determinato intervallo?

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