2012-12-19 39 views
5

Tôi đang cố gắng lọc Danh sách chuỗi dựa trên số lượng từ trong mỗi chuỗi. Tôi giả định rằng bạn sẽ cắt bất kỳ khoảng trắng nào ở cuối của chuỗi, và sau đó đếm số lượng dấu cách còn lại trong chuỗi, để WordCount = NumberOfSpaces + 1. Đó có phải là cách hiệu quả nhất để làm điều này không? Tôi biết rằng để lọc dựa trên nhân vật đếm sau đây là làm việc tốt ... chỉ không thể tìm ra cách để viết nó ngắn gọn bằng cách sử dụng C#/LINQ.Lọc chuỗi dựa trên số lượng từ

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

Bất kỳ ý tưởng nào để đếm từ?

UPDATE: Đây Làm việc như một nét duyên dáng ... Cảm ơn 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(); 

Trả lời

8

tôi sẽ tiếp cận nó một cách đơn giản hơn vì bạn đã chỉ ra rằng một không gian có thể được sử dụng đáng tin cậy như một dấu phân cách như vậy:

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

EDIT:

Nếu perforamnce tối ưu là cần thiết và sử dụng bộ nhớ là một mối quan tâm bạn có thể lệnh e phương pháp riêng của bạn và đòn bẩy IndexOf() (mặc dù có rất nhiều con đường để thực hiện trên một vấn đề như thế này, tôi chỉ thích tái sử dụng chứ không phải là từ-đầu thiết kế code):

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

Cảm ơn Mathew ... Sau đây đã hoạt động như một sự quyến rũ! – Jeagr

+0

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

+0

Phương pháp này hiệu quả hơn việc sử dụng truy vấn LINQ? – Jeagr

1

thế nào về việc tách chuỗi thành một mảng sử dụng không gian và đếm nó?

s.Split().Count() 

loại bỏ các không gian :)

+0

thêm RemoveEmptyEntries như trong câu trả lời của matthew sẽ idd được tốt hơn :) – ufosnowcat

+1

Không cần phải sử dụng '" " ', chỉ cần sử dụng' string.Split() 'mà không có đối số (hoặc null) và' Tách' giả định ký tự khoảng trống trắng làm dấu phân cách. –

3

Bạn tiếp cận để đếm chữ là ok. String.Split sẽ cho kết quả tương tự để sử dụng bộ nhớ nhiều hơn.

Thần chỉ thực hiện chức năng int WordCount(string text) của bạn và vượt qua nó để ở đâu:

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

Bạn muốn tất cả các chuỗi với từ đếm trong một phạm vi nhất định?

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); 
Các vấn đề liên quan