gpt4 book ai didi

c# - Linq 选择集合中的第一个事件记录

转载 作者:行者123 更新时间:2023-11-30 21:28:38 24 4
gpt4 key购买 nike

我正在尝试返回未处于取消状态的文档的最新修订版。但是,如果文档的所有修订都被取消,它应该仍然返回取消状态的最修订。

数据看起来像:
编号 |名称 |启 |地位
00 |手册 | 000 |积极的
00 |手册 | 001 |积极的
00 |手册 | 002 |积极的
00 |手册 | 003 |积极的
00 |手册 | 004 | Active//返回这个


编号 |名称 |启 |地位
01 |手册2 | 000 |积极的
01 |手册2 | 001 |积极的
01 |手册2 | 002 |积极的
01 |手册2 | 003 | Active//返回这个
01 |手册2 | 004 |取消


编号 |名称 |启 |地位
02 |手册3 | 000 |取消
02 |手册3 | 001 |取消
02 |手册3 | 002 |取消
02 |手册3 | 003 |取消
02 |手册3 | 004 |取消//返回这个

我可以轻松地对记录进行分组和排序。我也可以过滤我们的取消状态的记录,但在第三个数据集的情况下,所有文档都处于取消状态,我得到一个异常。

List<Records> r = records
.GroupBy(a => a.ID)
.Select(b => new Record
{
ID = b.Key,
Name = b.First().Name,
Rev = b.OrderByDescending(o => o.Rev)
.First(x=> x.status != "Cancel").Rev
}).ToList();

最佳答案

你几乎已经有了你所拥有的,你可以使用 ThenByOrderBy之后添加后续排序:

List<Records> r = records
.GroupBy(a => a.ID)
.Select(b => new Record
{
ID = b.Key,
Name = b.First().Name,
Rev = b.OrderBy(o => o.status == "Cancel")
.ThenByDescending(o => o.Rev)
.First().Rev
}).ToList();

注意:在此示例中,我在 status == "Cancel" 上订购了作为false < true .


编辑

根据评论部分对额外状态的要求:您可以创建一个函数将状态转换为数字排名:

public int GetStatusRank(string status)
{
switch (status)
{
case "active":
return 0;
case "endorsed"
return 1;
case "cancelled":
return 2;
//etc...
default:
return int.MaxValue;
}
}

然后您可以在您的 OrderBy 中使用它:

...b.OrderBy(o => GetStatusRank(o.status))

关于c# - Linq 选择集合中的第一个事件记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56228648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com