gpt4 book ai didi

c# - 使用 Linq 查找列表子集中的下一个元素

转载 作者:行者123 更新时间:2023-11-30 12:21:20 25 4
gpt4 key购买 nike

我有以下收藏

// The collection to query
var stageTable = new List<Stage>
{
new Stage {StageId = 1, LifecycleId = 1, StageSeqNo = 1},
new Stage {StageId = 2, LifecycleId = 1, StageSeqNo = 2},
new Stage {StageId = 3, LifecycleId = 1, StageSeqNo = 3},
new Stage {StageId = 4, LifecycleId = 1, StageSeqNo = 4},
new Stage {StageId = 5, LifecycleId = 2, StageSeqNo = 1},
new Stage {StageId = 6, LifecycleId = 2, StageSeqNo = 2},
new Stage {StageId = 7, LifecycleId = 2, StageSeqNo = 3},
new Stage {StageId = 8, LifecycleId = 2, StageSeqNo = 4},
};

我正在尝试构建一个将返回下一个 Stage 的查询给出 currentStage但包含在 LifecycleId 定义的同一子集中,例如给定 currentStage = 2我希望得到 StagestageId = 3返回,但带有 currentStage = 4我希望得到 nullLifecycleId 以来切换到值 2 .

这是我的

 var lifecycleId = stageTable
.Where(x => x.StageId == currentStageId)
.Select(x => x.LifecycleId);

var nextStage = stageTable
.Where(s => s.LifecycleId == lifecycleId.First())
.SkipWhile(s => s.StageId != currentStageId)
.Skip(1).FirstOrDefault();

它似乎有效,但有没有办法在单个查询中执行此操作?

最佳答案

如果安装 MoreLINQ NuGet package那么你可以使用如下代码:

var currentStageId = 4;

var nextStage = stageTable.SkipWhile(z => z.StageId < currentStageId)
.Lead(1, (x, y) => new { existing = x, next = y })
.Take(1)
.FirstOrDefault(z => z.next?.LifecycleId == z.existing.LifecycleId)?.next;

Console.WriteLine(nextStage?.StageId);

SkipWhile 将跳过当前行之前的数据。

Lead 将合并相邻行(即将当前行和下一行放在一起)。

Take 1 将确保我们只得到一行(同时表示当前行和下一行)。

并且 FirstOrDefault 将确保在第二行没有与第一行相同的 LifeCycleId 时返回 null。

关于c# - 使用 Linq 查找列表子集中的下一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45755665/

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