2016-12-01 58 views
1

我有一個名爲orderList的清單,其類型爲Order,它有兩個屬性。該列表如下所示。基於兩個屬性從清單中刪除項目

Id  Status 
123  Good 
878  Good 
432  Good 
123  Void 

我想要做的是去除有一個狀態是無效和有相同的ID爲無效爲了什麼好的訂單的任何訂單。所以結果會給我,

Id  Status 
878  Good 
432  Good 

這樣做的最佳方法是什麼?它只是得到一個使用linq的無效訂單清單,然後通過這個新清單循環移除共享同一個ID的好訂單?

+1

如果你顯示你到目前爲止,我會很好;) – octavioccl

回答

1

你可以組和後過濾,並壓平組在最後:

var result= list.GroupBy(e=>e.Id) 
       .Where(g=>g.Any(r=>r.Status=="Good") && g.All(r=>r.Status!="Void")) 
       .SelectMany(g=>g); 
+1

你確定這個工作正常嗎? – mybirthname

+1

@mybirthname,哦,我剛剛在我的解決方案中看到一個錯誤,謝謝,它已經修復 – octavioccl

1

所以,你需要組首先你ID,後指定的數據,並創建新的字段中刪除,這應該是真實的如果您的組狀態集合中有任何狀態Void。之後,請僅在Remove爲false且最終創建您的RootOrder的情況下收集對象。

var result = list.GroupBy(x => x.ID) 
      .Select(x => new { ID = x.Key, Status = x.FirstOrDefault().Status, Remove = x.Any(y => y.Status == "Void") }) 
      .Where(g => g.Remove == false) 
      .Select(r => new RootOrder { ID = r.ID, Status = r.Status }).ToList(); 

完整的代碼示例:dotNetFiddle

0

一種方式是分組,過濾和壓扁剩餘組 - 如果你想要更多的「文字」的查詢,你可以嘗試以下方法:

第一濾波器所有非GoodOrders的使用Where出:

orderList = orderList.Where(x => x.Status == Status.Good) 

然後過濾掉所有O F中的其餘Orders爲其中有GoodOrdersorderList中使用WhereAny含有相同Id非:

.Where(x => !orderList 
    .Any(y => y.Status == Status.Void && y.Id == x.Id) 

最後,使用ToList()取返回IEnumerable作爲List

orderList = orderList 
    .Where(x => x.Status == Status.Good) 
    .Where(x => !orderList 
     .Any(y => y.Status == Status.Void && y.Id == x.Id) 
    .ToList();