首页 > 解决方案 > LINQ / C#从一个列表中删除多个其他列表中的所有项目

问题描述

我有以下设置:

我的模型看起来像这样(简化):

public Model() {
   public List<Products> {get; set;}
   public List<Assortment> {get; set;}
}

并且分类看起来像这样(简化)

public Assortment() {
   public int ID {get; set;}
   public string Name {get; set;}
   public List<Product> Products {get; set;
}

我想展示所有不属于任何分类的产品

我试过这样的事情:

Model.Products.Except(x => Model.Assortments.Where(y => y.Products.Contains(x)).Select(z => z.Products).ToList()

但是编译器告诉我

“Lambdaexpression”无法转换为类型“IEnumerable”,因为它不是委托类型

(从德语翻译成英语)

我也尝试了 RemoveAll 或 Where 的一些东西,但我无法让它工作。

标签: c#asp.netlinqlambda

解决方案


使用 SelectMany,您可以获得任何分类中的所有产品

Model.Assortments.SelectMany(a => a.Products)

所以不属于任何分类的产品是:

Model.Products.Except(Model.Assortments.SelectMany(a => a.Products))

正如@GuruStron 在评论中指出的那样,这假设分类中的产品可以用 Products 集合中的产品来标识,因为它们是相同的对象或被合适的Equals覆盖。


推荐阅读