如何检查List<;T>;存在于另一个列表<;T>;

本文关键字:gt lt 存在 另一个 列表 检查 List 何检查 | 更新日期: 2023-09-27 18:22:44

友好通知:我知道嵌套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列表中的任何Joined Discounts是否有products列表中任何产品存在的产品列表。

我想我花了太多时间思考它,现在我很难弄清楚一些可能很简单的事情。

任何帮助都非常感谢

如何检查List<;T>;存在于另一个列表<;T>;

让我们从上到下开始。。。

如果任何联合折扣

好的,所以外部结构是:

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值。

这将为您提供joinedDiscounts中包含productsProductJoinedDiscount的枚举。

joinedDiscounts.Where(disc => disc.Products.Any(prod => products.Contains(prod)))

我认为这涵盖了你想要的东西。

使用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()
joinedDiscounts.Where(joinedDiscountse => joinedDiscountse.Products.Any()).ToList()