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

本文关键字:列表 包含 另一个 LINQ 选择 一个 使用 | 更新日期: 2023-09-27 18:21:31

我有以下类:

产品:

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>作为参数筛选我的产品?

编辑:有一件事我忘了提,如果我有两个类别,我应该只能看到类别1分类2的产品。到目前为止,我只返回了类别1或类别2的产品。尽管inheritIEquatableuse Intersect似乎很有趣,但我现在正在与Id进行比较。

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

如果您想返回其Categories中具有所有所提供类别的所有产品,这意味着它选择了具有类别1和类别2的产品。

然后您需要使用AllContains:的组合

public List<Product> FilterProducts(List<Category> categories)
{
    return products.Where(p => categories.All(c => p.Categories.Contains(c))
                   .ToList();
}

如果您想返回其拥有的所有产品,请从所提供的类别中至少返回一个类别,这意味着它会选择其拥有类别1或类别2的产品。

然后你需要使用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();
}