根据两个属性

时间:2016-12-01 14:23:22

标签: c# .net linq

我有一个名为orderList的{​​{1}}类型列表,它有两个属性。该列表如下所示。

Order

我想要做的是删除任何状态无效的订单以及任何与空订单具有相同ID的好订单。所以结果会给我,

 Id      Status
 123     Good
 878     Good
 432     Good
 123     Void

最好的方法是什么?它只是使用linq获取无效订单列表,然后循环遍历此新列表以删除共享相同ID的良好订单?

3 个答案:

答案 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();