我有以下课程:
产品:
public class Product
{
public string Name { get; set; }
public List<Category> Categories { get; set; }
}
和类别:
public class Category
{
public string Id { get; set; }
public string Name { get; set; }
}
我有以下方法:
public List<Product> FilterProducts(List<Category> categories)
{
// filtering code here
}
问题:如何使用List<Categories>
作为参数过滤我的产品?
编辑:有一件事我忘了提到,如果我有2个类别,我应该只能看到 category1 AND 的产品strong> category2 。到目前为止我所做的只返回了category1 OR category2的产品。虽然继承 IEquatable 使用Intersect似乎很有趣,但我现在正在与Id进行比较。
答案 0 :(得分:12)
如果您想要在Categories
中返回所有所有所提供类别的产品,这意味着它会选择具有category1和category2的产品。
然后,您需要将All
与Contains
:
public List<Product> FilterProducts(List<Category> categories)
{
return products.Where(p => categories.All(c => p.Categories.Contains(c))
.ToList();
}
如果您想要从提供的类别中返回具有至少一个 cetegory的所有产品,这意味着它选择具有category1或category2的产品。
然后你需要使用Any
public List<Product> FilterProducts(List<Category> categories)
{
return products.Where(p => categories.Any(c => p.Categories.Contains(c)
.ToList();
}
请注意,如果您的categories
个对象与产品Categories
属性中的实例不同,或者Category
中的Equals
对象不是Id
覆盖Id
使用public List<Product> FilterProducts(List<Category> categories)
{
return products.Where(p => categories
.All(c => p.Categories.Any(cat => cat.Id == c.Id)).ToList()
}
的方法您可能希望比较public List<Product> FilterProducts(List<Category> categories)
{
return products.Where(p => categories
.Any(cat => p.Categories.Any(pcat => pcat.Id == cat.Id)).ToList();
}
而不是类别对象本身。
类似于:
全部
的解决方案{{1}}
任何
的解决方案{{1}}