从列表中选择项目,其中子项包含使用LINQ的另一个列表中的项目

时间:2013-07-06 17:44:53

标签: c# linq

我有以下课程:

产品:

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 category2 。到目前为止我所做的只返回了category1 OR category2的产品。虽然继承 IEquatable 使用Intersect似乎很有趣,但我现在正在与Id进行比较。

1 个答案:

答案 0 :(得分:12)

如果您想要在Categories中返回所有所有所提供类别的产品,这意味着它会选择具有category1和category2的产品。

然后,您需要将AllContains

组合使用
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}}