如何使用 LINQ 查找包含 2 个逗号分隔的字符串的匹配项
Posted
技术标签:
【中文标题】如何使用 LINQ 查找包含 2 个逗号分隔的字符串的匹配项【英文标题】:How to find a match with 2 comma separated strings with LINQ 【发布时间】:2013-08-07 16:50:15 【问题描述】:我是 LINQ 的新手。
我正在尝试比较 2 个逗号分隔的字符串以查看它们是否包含匹配值。
我有一个包含代码列表的字符串。 masterFormList = "AAA,BBB,CCC,FFF,GGG,HHH"
我正在尝试将其与对象列表进行比较。在给定的字段 FormCode 中包含一个逗号分隔的代码字符串。我想看看这个字符串中的至少一个代码是否在 masterFormList 中。 我将如何编写 linq 来完成此任务?
现在我有:
resultsList = (from r in resultsList
where r.FormCodes.Split(',').Contains(masterFormList)
select r).ToList();
它不会从列表中返回任何匹配项。
请指教
【问题讨论】:
【参考方案1】:您需要构建要搜索的项目的集合,然后检查该集合中是否包含任何项目:
var masterSet = new HashSet<string>(masterFormList.Split(','));
resultsList = resultsList
.Where(r => r.FormCodes.Split(',')
.Any(code => masterSet.Contains(code)))
.ToList();
【讨论】:
如果逗号后面有空格(通常有)可以使用.Split(',').Select(p => p.Trim()).<continue>
【参考方案2】:
var masterFormList = "AAA,BBB,CCC,FFF,GGG,HHH";
var otherList = "XXX,BBB,YYY";
bool match = otherList.Split(',').Intersect(masterFormList.Split(',')).Any();
或者如果你想要匹配的项目
var matches = otherList.Split(',').Intersect(masterFormList.Split(',')).ToList();
【讨论】:
【参考方案3】:要回答上述问题,这将找到两个字符串之间的所有匹配项:
var matches =
from masterCode in masterFormList.Split(',')
join formCode in formCodes.Split(',') on masterCode equals formCode
select formCode;
foreach (string match in matches)
Console.WriteLine(match);
但是,如果您只想知道一个存在的话,那就太过分了。您可以使用相同的查询来执行此操作:
Console.WriteLine(matches.Any());
但是,这样做的工作量可能会超出严格必要的范围。修改 Reed Copsey 的答案可能是最简单的(如果我们要回答您帖子标题中的问题):
var masterSet = new HashSet<string>(masterFormList.Split(','));
bool atLeastOneMatch = formCodes.Split(',').Any(c => masterSet.Contains(c));
虽然这些是针对您所说的问题的合理惯用的 LINQ 解决方案(“我正在尝试比较 2 个逗号分隔的字符串以查看它们是否包含匹配值”),但它们可能与您实际看起来不太匹配want,即获取对象列表,并仅查找特定属性符合您的条件的对象。而join
可能是错误的方法,因为它看起来相当笨拙:
resultList =
(from formItem in resultList
from code in formItem.FormCodes.Split(',')
join masterCode in masterFormList.Split(',') on code equals masterCode
group code by formItem into matchGroup
select matchGroup.Key)
.ToList();
或者如果您愿意:
resultList =
(from formItem in resultList
from code in formItem.FormCodes.Split(',')
join masterCode in masterFormList.Split(',') on code equals masterCode into matchGroup
where matchGroup.Any()
select formItem)
.Distinct()
.ToList();
这些解决方案没有什么值得称赞的......
因此,鉴于您的代码中存在明显问题(与问题标题和帖子前 3 段中定义的问题相反),Reed Copsey 的解决方案更好。
我要做的一个调整是,如果你的主集是固定的,你只想构建一次HashSet<string>
,以摊销成本。所以要么你把它放在一个静态字段中:
private readonly static HashSet<string> masterSet =
new HashSet<tring>(masterFormList.Split(',');
或使用Lazy<T>
按需创建。
(在 Reed 在 cmets 中向我指出代码示例中明显的问题与问题中所述的问题不同之后,于 2013 年 8 月 8 日编辑。)
【讨论】:
问题在于 FormCodes 是集合中对象的属性 - 您是“最简单”的解决方案,仅检查单个“FormCodes”字符串,而不是集合中的所有字符串。它与原始帖子中的 API 不匹配... 你指的是resultsList
这里?原始代码有点不清楚resultsList
到底是什么,因为他将它用作查询的结果和源。也许我从字面上理解了他的“我正在尝试比较 2 个逗号分隔的字符串”。
调整了我的答案,以考虑到代码和问题标题/前 3 段之间的差异。感谢您指出我错过的内容。以上是关于如何使用 LINQ 查找包含 2 个逗号分隔的字符串的匹配项的主要内容,如果未能解决你的问题,请参考以下文章