从linq查询中删除字符串

时间:2015-02-15 15:29:03

标签: c# regex linq

我有一个返回名称的linq查询:

Joe
Joe (1)
Joe Bloggs
Joe (2)
Joe Bloggs (1)

从列表中删除Joe Bloggs条目的最佳方法是什么,因此我的结果集将是 - 名称重复的格式将始终为(n)其中n是该名称的递增数字:

Joe
Joe (1)
Joe (2)

我使用以下内容尝试删除我需要的元素

 newResults = results.Distinct().ToList();

然而,它似乎只会删除重复条目。我希望在linq查询中使用正则表达式来查找Joe的任何条目以及Joe (的任何条目,但不确定正则表达式是否是正确的实现方式。

我还插入了一个linq查询,如下所示:

var searchName = "Joe";
var results = names.Where(name => name.Equals(searchName)).ToList();

再次这只返回1个条目 - 你可以在.Equals中包含一个正则表达式来表示找到名称等于搜索名称的任何名称或者等于搜索名称+空格+(

3 个答案:

答案 0 :(得分:1)

您可以使用Regex.IsMatch方法只获取以Joe开头,后跟可选(1)(2)等字符串的字符串:

 var pattern = @"Joe(?=(\W?\(\d+\))|$)";
 var results = names.Where(name => Regex.IsMatch(name, pattern)).ToList();

根据您提供的示例输入results将为{"Joe", "Joe (1)", "Joe (2)"}

答案 1 :(得分:0)

您需要优化查询以仅返回所需的数据。如果无法做到这一点,则必须在获得后对集合应用进一步的查询。除此之外,尝试使用循环结构通过比较集合中的每个项目然后使用所需代码响应匹配来删除不需要的条目。

答案 2 :(得分:0)

如果我理解正确,您希望排除包含" Bloggs "这个词,所以...

List<string> joes = new List<string>{"Joe", "Joe (1)", "Joe Bloggs", "Joe (2)", "Joe Bloggs (1)"};

var qry = joes.Where(j=>!j.Contains("Bloggs"));

结果:

Joe 
Joe (1) 
Joe (2)