我有一个具有多层嵌套的复杂对象。 Order
内部包含多个Orderline
,每个Orderline
都有Product
列表。我需要删除/删除包含UseByDate比现在更早的产品的Orderline
。
我已经尝试了
orders.Orderlines.RemoveAll(x => x.products.FindAll(z => z.UseByDate > DateTime.Now);
我的课程:
class Order
{
public int Orderid { get; set; }
public string customerName { get; set; }
public List<Orderline> Orderlines { get; set; }
}
public class Orderline
{
public int orderid { get; set; }
public string Name { get; set; }
public int orderlineid { get; set; }
public List<Product> products { get; set; }
}
public class Product
{
public int orderlineid { get; set; }
public DateTime UseByDate { get; set; }
}
答案 0 :(得分:2)
RemoveAll删除与指定谓词定义的条件匹配的所有元素。即括号中的位需要返回一个布尔值。
orders.Orderlines.RemoveAll(o => o.products.Any(p => p.UseByDate > DateTime.Now))
答案 1 :(得分:1)
foreach(var order in orders.Orderlines) {
bool isValid = true;
foreach(var product in order.Products) {
if (DateTime.Compare(product.UseByDate, DateTime.Now) > 0) {
isValid = false;
}
}
if (isValid = false) {
orders.OrderLines.Remove(order);
}
}
我认为这样的事情应该能够实现这一目标(旧式而不是使用linq)。
使用linq时,您应该返回一个包含所有具有无效订单行的对象(订单行)的列表。然后有一个foreach删除它们。据我所知,最佳做法是将选择/发现和删除/动作元素分开(但我可能是错的:D)