2012-12-19 20 views
5

पर आधारित एक स्ट्रिंग फ़िल्टर करना मैं प्रत्येक स्ट्रिंग में शब्दों की संख्या के आधार पर तारों की एक सूची फ़िल्टर करने की कोशिश कर रहा हूं। मुझे लगता है कि आप स्ट्रिंग के सिरों पर किसी भी सफेद-स्थान को ट्रिम करेंगे, और फिर स्ट्रिंग में छोड़े गए रिक्त स्थान की संख्या गिनेंगी, ताकि WordCount = NumberOfSpaces + 1. क्या यह करने का सबसे प्रभावी तरीका है? मुझे पता है कि चरित्र गणना के आधार पर फ़िल्टरिंग के लिए निम्नलिखित ठीक काम कर रहा है ... बस यह समझ नहीं सकता कि इसे सी #/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(); 
} 

शब्दों की गिनती के लिए कोई विचार?

अद्यतन: यह एक आकर्षण की तरह काम किया ... धन्यवाद मैथ्यू:

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); sortBox1 = sortBox1.Where (x => x.Trim()। स्प्लिट (नया char [] {''}, स्ट्रिंगस्प्लिटऑप्शन। रीमूवइएक्ट्रीइन्ट्रीज़) .उंट()> = minWords && x.Trim()। विभाजन (नया char [] {''}, StringSplitOptions.RemoveEmptyEntries)। गणना() <= maxWords) .ToList(); – Jeagr

+0

क्या LINQ क्वेरीज़ का उपयोग करने की तुलना में यह अधिक कुशल है? – Jeagr

1

के बारे में कैसे एक सरणी के लिए स्ट्रिंग बंटवारे का उपयोग कर अंतरिक्ष और गिनती है कि?

s.Split().Count() 

को अंतरिक्ष :)

+0

मैथ्यू के जवाब में RemoveEmptyEntries जोड़ना बेहतर होगा :) – ufosnowcat

+1

'" ', केवल तर्क के बिना' string.plit() 'का उपयोग करें (या शून्य) और 'स्प्लिट' सफेद-स्पेस वर्णों को विभाजक के रूप में मानता है। –

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); 
संबंधित मुद्दे