如何检查List <t>中对象的属性是否存在于另一个List <t>中?

时间:2015-11-18 20:07:09

标签: c# linq list

友情提示: 我知道嵌套的foreach方法,但如果有更有效的方法,我试图避免使用它。

第1类的设置:

public class Product{

      public int ID {get; set;}
      //Other irrelevant properties
}

第2课的设置:

public class JoinedDiscounts{

      public int ID {get; set;}
      public List<Product> Products = new List<Product>();
      //Other irrelevant properties

}

假设我现在有一个产品列表(我已将特定产品过滤到此列表中):

List<Product> products;

我也有这个清单。

List<JoinedDiscount> joinedDiscounts;

我的目标是检查joinedDiscounts列表中的任何加入折扣是否都包含产品列表,其中products列表中的任何产品都存在。

我认为我花了太多时间思考它,现在我很难搞清楚可能非常简单的事情。

非常感谢任何帮助

4 个答案:

答案 0 :(得分:3)

让我们从头到尾开始......

  

如果有任何加入折扣

好的,所以外部结构是:

joinedDiscounts.Any()

但我们需要一个布尔子句......

  

有一个产品清单,其中任何

好的,我们要检查.Products属性,并知道该列表中的任何内容是否与条件匹配:

joinedDiscounts.Any(jd => jd.Products.Any())

现在我们需要那里的布尔子句 ...

  

产品列表中的任何产品都存在

那么,如果products包含此集合的任何给定产品?

joinedDiscounts.Any(jd => jd.Products.Any(p => products.Contains(p)))

应该这样做,至少在语义上。

然而,如果没有在该类上定义Product的比较器,那么代码可能只是进行参考比较,这可能不是您想要的。 (两个实例可能具有相同的值,并且概念上代表相同的产品,但它们不会 Product类的相同实例。)如果你需要进一步深入ID进行手动比较,你必须做这样的事情:

joinedDiscounts.Any(jd => jd.Products.Any(prod => products.Select(p => p.ID).Contains(prod.ID)))

随着代码的增长,我建议将比较逻辑适当地封装到模型中。在这种情况下,实施.Equals().GetHashCode()应该可以解决问题。消费代码的方式很简单,逻辑封装在它所属的对象上。这样您就可以对对象进行语义直观的比较,而不是手动钻取ID值。

答案 1 :(得分:2)

这应该为您提供JoinedDiscount中包含joinedDiscountsProduct的{​​{1}}的枚举。

products

认为涵盖了您正在寻找的内容。

答案 2 :(得分:0)

joinedDiscounts.Where(joinedDiscountse => joinedDiscountse.Products.Any()).ToList()

答案 3 :(得分:0)

使用linq你可以做到这一点

List<JoinedDiscount> joinedDiscounts; //the joined products
List<Product> products; //desired products


joinedDiscounts.Where(d => d.Products.Any(
                     p => products.Select(prod => prod.ID).Contains(p.ID)
                     ).ToList()