2010-07-10 4 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(); 

다른 방법을, 당신은 대신 string[]List<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

아 .. 좋아 .. 나는 이것을 시도 할 것입니다. 감사 ! –

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. 그러면 람다 표현식은 다음과 같습니다.

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

즉, 짧은 단어 인 목록의 모든 구성원을 제거하십시오. 물론 변수를 사용하여 결과를 지정하려면 변수에 결과를 지정해야합니다.

또한 현재 함수에서 true 및 false가 거꾸로 표시됩니다. 당신이 실제로 checkShortWord 실제로 짧은 단어 true을 반환 오히려 잘못된 message 변수보다 목록 (IEnumerable<string>)을 가지고 있고, 가정

1

, 당신은이 작업을 수행 할 것 :

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