Как вы чистите список только для соответствующих строк?
Я пытаюсь создать процедуру, которая берет список из 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)));
У меня нет кода под рукой, но вы можете конвертировать каждый list
к datatable
затем используйте соединение. Это должно привести к тому, что начальный список будет очищен.