首页 > 解决方案 > LINQ 分组和过滤特定记录

问题描述

public class Data
{
    public int Id { get; set; }
    public string Status { set; get; }
}

List<Data> dta = new List<Data>
{
    new Data { Id =1 , Status ="Open"},
    new Data { Id =1 , Status ="Pending"},
    new Data { Id =2 , Status ="Open"},
    new Data { Id =3 , Status ="Open"},
};

到目前为止尝试过

var outPutData = dta.GroupBy(x => x.Id).Select(g => g.FirstOrDefault(x => x.Status == "Pending"));

我在outPutData收藏中得到了如下结果

Id =1 , Status ="Pending"
null
null

outPutData 集合中的预期结果

Id =1 , Status ="Pending"
Id =2 , Status ="Open"
Id =3 , Status ="Open"

标签: c#linq

解决方案


您当前的 Id=2 和 Id=3 对象没有待处理状态;没有这样的对象,所以 FirstOrDefault 的结果是“默认”,即 null - FirstOrDefault 的意思是“给我可能很多中的第一个对象,条件为真,或者如果没有匹配的对象,给我默认值类型(通常为空)”

也许你想要类似的东西

var outPutData = dta.GroupBy(x => x.Id).Select(g => g.OrderBy(x => x.Status == "Pending"?0:1).First());

这将对待处理的对象进行排名(排序),以便它们位于任何打开的对象之前,因此将首先被拾取,但重要的是它不会丢弃任何东西,因此打开的对象仍然可用。


推荐阅读