[英]removing items from a list based on two properties
我有一個名為orderList
的類型為Order
的列表,它具有兩個屬性。 該列表如下所示。
Id Status
123 Good
878 Good
432 Good
123 Void
我想做的是刪除狀態為空的所有訂單以及具有與空訂單相同的ID的所有好訂單。 結果會給我,
Id Status
878 Good
432 Good
做這個的最好方式是什么? 它只是使用linq獲取空訂單列表,然后循環瀏覽此新列表以刪除共享相同ID的好訂單嗎?
您可以稍后進行分組和過濾,並在末尾展平分組:
var result= list.GroupBy(e=>e.Id)
.Where(g=>g.Any(r=>r.Status=="Good") && g.All(r=>r.Status!="Void"))
.SelectMany(g=>g);
因此,您需要首先按ID
分組,然后再指定您的數據並創建新的字段刪除,如果您的組狀態集合中有任何狀態Void
,則應為true。 之后,僅使用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
一種方法是對其余組進行分組,過濾和展平-如果您想進行更“文字化”的查詢,可以嘗試以下操作:
首先篩選出所有非的Good
Orders
使用Where
:
orderList = orderList.Where(x => x.Status == Status.Good)
然后使用Where
和Any
過濾掉orderList
包含相同Id
Any
非Good
Orders
所有剩余Orders
:
.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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.