如何使用 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 =&gt; p.Trim()).&lt;continue&gt;【参考方案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&lt;string&gt;,以摊销成本。所以要么你把它放在一个静态字段中:

private readonly static HashSet<string> masterSet =
    new HashSet<tring>(masterFormList.Split(',');

或使用Lazy&lt;T&gt; 按需创建。

(在 Reed 在 cmets 中向我指出代码示例中明显的问题与问题中所述的问题不同之后,于 2013 年 8 月 8 日编辑。)

【讨论】:

问题在于 FormCodes 是集合中对象的属性 - 您是“最简单”的解决方案,仅检查单个“FormCodes”字符串,而不是集合中的所有字符串。它与原始帖子中的 API 不匹配... 你指的是resultsList这里?原始代码有点不清楚resultsList 到底是什么,因为他将它用作查询的结果和源。也许我从字面上理解了他的“我正在尝试比较 2 个逗号分隔的字符串”。 调整了我的答案,以考虑到代码和问题标题/前 3 段之间的差异。感谢您指出我错过的内容。

以上是关于如何使用 LINQ 查找包含 2 个逗号分隔的字符串的匹配项的主要内容,如果未能解决你的问题,请参考以下文章

将数组存储为逗号分隔,如何使用 LINQ 进行查询?

在 Python 中查找逗号分隔列表中的第 N 个项目

如何匹配在linq中具有多个用逗号分隔的整数值的列?

检查逗号分隔列表是不是包含特定数字[重复]

如何在一个单元格中查找每个逗号分隔值?

如何将 PHP 逗号分隔的字符串集成到 SQL 查询中?