我有一个项目列表,其中包含属性(ProductNames)IEnumberable<string>
。如何在属性上过滤此列表,以便我只获得项目与另一个IEnumerable<string>
(FilterProductNames)中的所有项目匹配的列表?
我尝试过以下内容,但它似乎返回过滤器IEnumberable中匹配任何内容(OR样式匹配)的所有项目:
Items.Where(x => x.ProductNames.Intersect(FilterProductNames).Any())
更新
我试过在下面使用Tim的答案,但它似乎给了我一个空集,所以我尝试在FilterProductNames中只有一个项目,但这仍然没有给我任何东西所以我通过执行以下操作测试了相同的过滤器:
if (count == 1)
{
// this will return me 4 items
Items = Items.Where(x => x.ProductNames.Contains(FilterProductNames.First()));
}
else
{
// when I remove the above if, this will return me 0 items filtering on the same thing
Items = Items.Where(x => x.ProductNames.All(pn => FilterProductNames.Contains(pn)));
// have also tried the other version on tim's answer but to no avail:
// Items = Items.Where(x => !x.ProductNames.Except(FilterProductNames).Any());
}
更新2
对于造成一些混淆的错误措辞感到抱歉,我在包含FilterProductNames中所有名称的项目之后,但不仅限于FilterProductNames中的项目,例如,如果我搜索产品名称为Test的项目, Test1,它应该带回包含这些名称以及任何其他名称的任何项目。
这可能吗?
答案 0 :(得分:5)
您可以使用Enumerable.All
:
Items.Where(x => x.ProductNames.All(pn => FilterProductNames.Contains(pn)))
或 - 可能更高效 - 使用! ... Except.Any
:
Items.Where(x => !x.ProductNames.Except(FilterProductNames).Any());
修改 acc。您的评论/编辑:“...包含FilterProductNames中所有名称的所有项目”
然后你必须撤销声明:
Items.Where(x => FilterProductNames.All(fp => x.ProductNames.Contains(fp)));
或
Items.Where(x => !FilterProductNames.Except(x.ProductNames).Any());