Как вы чистите список только для соответствующих строк?

Я пытаюсь создать процедуру, которая берет список из textBox, а затем очищает его, используя другой список. Только строки с соответствующим текстом останутся. Я не думаю, что смогу использовать RegEx, потому что я не знаю, из чего будет состоять список очистки. Совпадение не должно быть абсолютным. Например:

'ant' from my scrub list would match 'antiques', 'manta', 'ants', etc.

Я думал, что на правильном пути со следующим кодом, но я получаю красные кривые под обеими двумя последними строками кода. Любая помощь приветствуется:

List<string> masterList = new List<string>(textBox_masterList.Text.Split(','));    
List<string> scrubList = new List<string>(textBox_scrubList.Text.Split(','));
for (int i = 0; i < masterList.Count; i++)
    masterList = masterList.Where(x => x.Contains(scrubList));

или же

    masterList = masterList.RemoveAll(x => x.!Contains(scrubList));

Что я здесь не так делаю?

4 ответа

Решение
List<string> masterList = new List<string>(textBox_masterList.Text.Split(','));
List<string> scrubList = new List<string>(textBox_scrubList.Text.Split(','));
masterList = masterList.Where(x => scrubList.Any(s => x.Contains(s)))
                       .ToList();

Чтобы сделать поиск нечувствительным к регистру:

masterList = masterList.Where(x => scrubList.Any(s => 
                          Regex.IsMatch(x, s, RegexOptions.IgnoreCase)))
                       .ToList();

Эффективный и короткий подход использует Enumerable.Except:

masterList = masterList.Except(scrubList).ToList();

Если вы хотите использовать RemoveAll который не должен создавать временный список:

masterList.RemoveAll(str => scrubList.Contains(str));

Так как вы хотите удалить все строки, которые находятся в scrubList,

Изменить: чтобы сделать его без учета регистра:

masterList.RemoveAll(str => scrubList.Any(s => s.Equals(str, StringComparison.OrdinalIgnoreCase)));

Оператор for бесполезен, вы не используете переменную i.

У меня нет кода под рукой, но вы можете конвертировать каждый list к datatable затем используйте соединение. Это должно привести к тому, что начальный список будет очищен.

Другие вопросы по тегам