友情提示: 我知道嵌套的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
列表中的任何产品都存在。
我认为我花了太多时间思考它,现在我很难搞清楚可能非常简单的事情。
非常感谢任何帮助
答案 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
中包含joinedDiscounts
中Product
的{{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()