7

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

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

请指教

4

3 回答 3

12

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

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

resultsList = resultsList
                 .Where(r => r.FormCodes.Split(',')
                              .Any(code => masterSet.Contains(code)))
                 .ToList();
于 2013-08-07T16:52:43.790 回答
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();
于 2013-08-07T17:10:09.380 回答
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 个逗号分隔的字符串以查看它们是否包含匹配值”),但它们可能与您实际想要的不太匹配,这是获取对象列表,并仅查找特定属性符合您的标准的对象。ajoin可能是错误的方法,因为它看起来相当笨拙:

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 在评论中向我指出代码示例中明显的问题与问题中所述的问题不同之后,于 2013 年 8 月 8 日编辑。)

于 2013-08-07T17:05:32.097 回答