C# 查找集合中的下一条记录:LINQ

C# 查找集合中的下一条记录:LINQ,c#,linq,C#,Linq,我有一个对象列表,所有对象都有一个id属性 例如 1,10,25,30,4 我有一个currentId,我需要在列表中找到下一个Id 例如,当前Id设置为25,我需要返回Id为30的对象。之后的一个是4 在LINQ我该如何优雅地做到这一点 编辑 列表按“排序”属性排序。因此,您不能只按id订购,因为那样会打乱订单。有很多解决方案。我建议如下 int currentId = 25; var next = yourCollection.Where(i => i.Id > currentI

我有一个对象列表,所有对象都有一个id属性

例如

1,10,25,30,4

我有一个currentId,我需要在列表中找到下一个Id

例如,当前Id设置为25,我需要返回Id为30的对象。之后的一个是4

在LINQ我该如何优雅地做到这一点

编辑


列表按“排序”属性排序。因此,您不能只按id订购,因为那样会打乱订单。

有很多解决方案。我建议如下

int currentId = 25;
var next = yourCollection.Where(i => i.Id > currentId).OrderBy(i => i.Id).First();
var next = items
    .Where(item => item.Id > currentId)
    .OrderBy(item => item.Id)
    .First();

var next = items
    .OrderBy(item => item.Id)
    .First(item => item.Id > currentId);
var next = items
    .SkipWhile(item => item.Id != currentId)
    .Skip(1)
    .FirstOrDefault();
如果希望ID按其在集合中的显示顺序排列,可以使用以下命令

var next = items
    .Where(item => item.Id > currentId)
    .OrderBy(item => item.Id)
    .First();

var next = items
    .OrderBy(item => item.Id)
    .First(item => item.Id > currentId);
var next = items
    .SkipWhile(item => item.Id != currentId)
    .Skip(1)
    .FirstOrDefault();
如果返回
null
,则表示您已尝试获取最后一个项目的下一个项目。

而无需重新排序(注意,我略作编辑,因为我认为我误读了问题):

显然,如果
data
是一组对象,比如:

var next = data.SkipWhile(obj => obj.Id != last).Skip(1).First();

如果您只想得到一个对象,为什么不重新排序查询?另外,如果这到达列表的末尾并试图跳过,它会抛出异常还是只返回null。我需要检查这个吗?目前,它会抛出-但您可以使用
FirstOrDefault
,它不会抛出。