2010-07-10 6 views
0

Как я могу построить выражение LINQ для удаления значений из одного списка, соответствующих критериям функции, возвращающей логическое значение? ТеперьLINQ Справка для функции boolean для списка

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

Ах .. хорошо .. Я попробуем это. Благодаря ! –

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

Другими словами, удалите всех членов списка, которые являются короткими словами. Конечно, вам также нужно присвоить свой результат переменной, если вы хотите что-то сделать с ней.

Кроме того, в вашей текущей функции ваши истинные и ложные появляются в обратном порядке.

1

Предполагая, что вы на самом деле есть список (IEnumerable<string>), а не вашей неправильной message переменной, и что на самом деле возвращает checkShortWordtrue для коротких слов, то вы могли бы сделать это:

IEnumerable<string> before = new [] {"days", "of", "the", "week"}; 
IEnumerable<string> after = before.Where(word => !checkShortWord(word)); 
Смежные вопросы