我是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();
它不会从列表中返回任何匹配的项目。
请告知
答案 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在评论中向我指出,代码示例中显而易见的问题与问题中陈述的问题不同。)