2

我正在尝试创建一个例程,该例程从文本框中获取一个列表,然后使用另一个列表对其进行清理。仅保留具有匹配文本的字符串。我不认为我可以使用 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

4 回答 4

3

一种有效而简短的方法是使用Enumerable.Except

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

如果你想使用RemoveAllwhich 不需要创建临时列表:

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

由于您要删除scrubList.

编辑:使其不区分大小写:

masterList.RemoveAll(str => scrubList.Any(s => s.Equals(str, StringComparison.OrdinalIgnoreCase)));
于 2012-12-18T10:19:30.530 回答
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();
于 2012-12-18T10:21:08.417 回答
2

for 语句没用,你不用变量 i。

于 2012-12-18T10:22:11.303 回答
0

我手头没有代码,但您可以将每个代码转换listdatatable然后使用连接。这应该会导致最初的列表被清理掉。

于 2012-12-18T10:18:08.627 回答