我有一个名为orderList
的{{1}}类型列表,它有两个属性。该列表如下所示。
Order
我想要做的是删除任何状态无效的订单以及任何与空订单具有相同ID的好订单。所以结果会给我,
Id Status
123 Good
878 Good
432 Good
123 Void
最好的方法是什么?它只是使用linq获取无效订单列表,然后循环遍历此新列表以删除共享相同ID的良好订单?
答案 0 :(得分: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 :(得分:1)
因此,您需要先在ID
之后分组,然后指定您的数据并创建新的字段删除,如果您的群组状态集合中有任何状态Void
,则该字段应为true。之后,仅在Remove
为假的情况下拍摄对象,最后创建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
答案 2 :(得分:0)
一种方法是对其余组进行分组,过滤和展平 - 如果您想要更“文字”的查询,可以尝试以下方法:
首先使用Where
过滤掉所有非Good
Orders
:
orderList = orderList.Where(x => x.Status == Status.Good)
然后使用{{3}过滤掉Orders
中包含相同Good
的非Orders
orderList
的所有剩余Id
}和Where
:
.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();