c# - 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"
解决方案
您当前的 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());
这将对待处理的对象进行排名(排序),以便它们位于任何打开的对象之前,因此将首先被拾取,但重要的是它不会丢弃任何东西,因此打开的对象仍然可用。
推荐阅读
- build - 如何使运行 Cargo 构建脚本成为可选?
- python - 在 Python 3 中转换摄氏度和华氏度
- rest - 如何使用 REST API 在 Magento2 中取消客户订单并重新订购
- python - Python MultiIndex 列重命名
- python - 识别表格行和表格数据 - CSS Selector Python
- c# - 如何使用 RDLC 报告 c# 在不剪切的情况下打印动态纸张高度?
- sql - LAG SQL 操作在 Amazon Redshift 中不起作用
- linux - 两台主机之间的隧道 Gre 问题(vps 和专用服务器)
- javascript - 在 three.js 中创建锯齿形结构?
- mysql - 为什么我的 Node.Js 代码在从用户那里获取价值时没有在第一个请求中给出响应?