我正在尝试创建一个例程,该例程从textBox中获取List,然后使用另一个List擦除它。只保留具有匹配文本的字符串。我不认为我可以使用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));
我在这里做错了什么?
答案 0 :(得分:3)
一种有效而简短的方法是使用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)));
答案 1 :(得分:3)
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();
答案 2 :(得分:2)
for语句没用,你不使用变量i。
答案 3 :(得分:0)
我手头没有代码,但您可以将每个list
转换为datatable
,然后使用联接。这应该在初始列表被清除时产生。