如何检查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
列表中任何产品存在的产品列表。
我想我花了太多时间思考它,现在我很难弄清楚一些可能很简单的事情。
任何帮助都非常感谢
让我们从上到下开始。。。
如果任何联合折扣
好的,所以外部结构是:
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
中包含products
中Product
的JoinedDiscount
的枚举。
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()