2016-12-06 5 views
0

複数のネスティングレベルを持つ複雑なオブジェクトがあります。 Orderには内部でいくつかのOrderlineが含まれており、それぞれOrderlineProductです。 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

私たちにいくつかのコードを教えてください。私はあなたが "ネストされたオブジェクトリスト"の意味を理解していないし、あなたのオブジェクトがどのように見えるのかも分かりませんが、何らかの理由でLINQの 'SelectMany'を[ここ](http:// stackoverflow) com/questions/27912901/nested-foreach-as-linq-with-chained-linked-list)を参照してください。 – Quantic

+0

AにはBのリストがあり、BにはCのリストがあり、BのCのリストから項目を削除したいと言っていますか?もしそうなら、それは本当にLINQの質問ではありません。 –

+0

がコードで質問を更新しました。基本的には、order - orderline - productsリストから古いものを使用しているすべての製品を削除する必要があります。 – user2613228

答えて

2

REMOVEALLは、指定された述語によって定義された条件に一致するすべての要素を削除します。すなわち、括弧内のビットはブール値を返す必要があります。

orders.Orderlines.RemoveAll(o => o.products.Any(p => p.UseByDate > DateTime.Now)) 
+0

ありがとうございました! – user2613228

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)

+0

ありがとうございました! – user2613228

関連する問題