如何根据嵌套列表条件

时间:2016-12-06 19:58:38

标签: c# linq

我有一个具有多层嵌套的复杂对象。 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; }
}  

2 个答案:

答案 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)