要回答上述问题,这将找到两个字符串之间的所有匹配项:
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 日编辑。)