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