如何使用LINQ查找具有2个逗号分隔字符串的匹配项

本文关键字:字符串 分隔 LINQ 何使用 查找 2个 | 更新日期: 2023-09-27 18:26:55

我是LINQ的新手。

我试图比较两个逗号分隔的字符串,看看它们是否包含匹配的值。

我有一个包含代码列表的字符串。masterFormList="AAA、BBB、CCC、FFF、GGG、HHH"

我正试图将它与对象列表进行比较。在给定的字段中,FormCode包含一个逗号分隔的代码字符串。我想看看这个字符串中是否至少有一个代码在masterFormList中。我将如何编写linq来实现这一点?

现在我有:

resultsList = (from r in resultsList
where r.FormCodes.Split(',').Contains(masterFormList)
select r).ToList();

它不返回列表中的任何匹配项。

请告知

如何使用LINQ查找具有2个逗号分隔字符串的匹配项

您需要构建一个要搜索的项目集合,然后检查该集合中是否包含任何项目:

var masterSet = new HashSet<string>(masterFormList.Split(','));
resultsList = resultsList
                 .Where(r => r.FormCodes.Split(',')
                              .Any(code => masterSet.Contains(code)))
                 .ToList();
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();

要回答上述问题,将查找两个字符串之间的所有匹配项:

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个逗号分隔的字符串,看看它们是否包含匹配的值"),但它们可能与您实际想要的不太匹配,即获取对象列表,只查找特定属性符合您标准的对象。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(',');

或者使用CCD_ 3按需创建它。

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