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

时间:2013-08-07 16:50:16

标签: c# linq

我是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();

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

请告知

3 个答案:

答案 0 :(得分:8)

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

var masterSet = new HashSet<string>(masterFormList.Split(','));

resultsList = resultsList
                 .Where(r => r.FormCodes.Split(',')
                              .Any(code => masterSet.Contains(code)))
                 .ToList();

答案 1 :(得分:4)

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();

答案 2 :(得分:0)

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

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(',');

或使用Lazy<T>按需创建它。

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