簡體   English   中英

從列表中選擇項目,其中子項包含使用LINQ的另一個列表中的項目

[英]Select items from a List where the children contain the items from another List using 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個類別,我應該只能看到類別1 類別2的產品。 到目前為止我所做的只返回了category1 OR category2的產品。 雖然繼承IEquatable使用Intersect似乎很有趣,但我現在正在與Id進行比較。

如果要返回其Categories包含所有提供的類別的所有產品,這意味着它選擇具有category1和category2的產品。

然后你需要使用All with Contains的組合:

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

如果您想從所提供的類別中返回所有產品中的至少一個產品,這意味着它選擇具有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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM