簡體   English   中英

基於兩個屬性從列表中刪除項目

[英]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)

然后使用WhereAny過濾掉orderList包含相同Id AnyGood 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM