2010-07-10 74 views
0

我該如何構造一個LINQ表達式來從一個列表中刪除符合返回布爾值的函數的條件的值?LINQ列表布爾函數的幫助

string[] message = "days of the week" 
message.ToList().RemoveAll(c=>checkShortWord(c)); 

public static bool checkShortWord(string word) { 
     if ((word.Length > 3) &&       
      (!Regex.IsMatch(word, "^[0-9]+$")))   
     return true; 

     return false; 
} 

我的結局字符串數組現在應該是:

message = {"days","week"} 

我應該怎麼改?我的消息數組從不改變。

回答

3

你正在建設一個新的列表,並從列表中刪除的項目,然後把它扔遠。如果你想要的是缺少移除項目的一個數組,你需要創建一個新的:

string[] message = "days of the week".Split(' '); 
message = message.Where(c => checkShortWord(c)).ToArray(); 

或者,你可以使用一個List<String>代替string[],然後使用RemoveAll方法來修改它地點:

List<string> message = "days of the week".Split(' ').ToList(); 
message.RemoveAll(c => !checkShortWord(c)); 

正如其他人所提到的,你也已經很糟糕地命名了你的謂詞方法。 「IsLongWord」可能更合適。你可以把它寫得更簡單一些:

public static bool IsLongWord(string word) 
{ 
    return word.Length > 3 && !Regex.IsMatch(word, "^[0-9]+$"); 
} 
+0

啊..好吧..我會嘗試這個。謝謝 ! – 2010-07-10 16:33:14

1

三件事。一,消息不是一個數組(我假設它是在你的真實代碼中)。二,你的方法是倒退。三,你沒有保留對這個列表的引用。

var list = message.ToList(); 
list.RemoveAll(word=>word.Length <= 3 || Regex.IsMatch(word, "^[0-9]+$")); 

如果你不能改變/消除方法(例如,你在其他地方使用):

var list = message.ToList(); 
list.RemoveAll(word=>!checkShortWord(word)); 
1

不要給你的方法命名checkShortWord。這很混亂。在真正檢查的內容後命名,例如IsShortWord。然後你的lambda表達式如下所示:

message.ToList().RemoveAll(c => IsShortWord(c)); 

換句話說,刪除所有短列表的成員。當然,如果你想對它做任何事情,你也需要將你的結果分配給一個變量。

此外,在你目前的功能中,你的真實和虛假似乎是倒退。

1

假設你確實有一個列表(IEnumerable<string>),而不是你的不正確message變量,而實際上checkShortWord短的話返回true,那麼你可以這樣做:

IEnumerable<string> before = new [] {"days", "of", "the", "week"}; 
IEnumerable<string> after = before.Where(word => !checkShortWord(word));