如何使用LINQ从集合中获取第二个元素?

12

我有一个愚蠢的问题。我有一个数据库,需要获取第二项而不仅仅是第一项。我可以轻松地打开第一项

var source = _context.SourceLogs.Where(a => a.SourceID == user.ID).First()

但是我不知道如何打开第二个。我是C#新手,所以唯一想到的就是这样

var source = _context.SourceLogs.Where(a => a.SourceID == user.ID).First(-1)

但显然这行不通。任何形式的帮助都将不胜感激。谢谢。


我不确定,但我认为你不能使用First()获取第二个元素,也许你应该尝试获取SourceLogs的列表,然后使用索引1来获取第二个元素。或者使用描述第二个元素的特定条件。 - Vecihi Baltacı
5个回答

23
你可以使用 LINQ 的 Skip 方法来跳过第一个并获取其后的一个:
var source = _context.SourceLogs.Where(...).Skip(1).First();

Skip 的作用是创建一个新的 IEnumerable,其中包含除第一个项之外的所有项。然后,您从该新 IEnumerable 中获取第一个(First())。


实际上,已经有一个适用于此精确事项的LINQ方法:ElementAt。请查看下面的答案。 - Kędrzu

7
var source = _context.SourceLogs.Where(a => a.SourceID == user.ID).ElementAt(1);

这将选择第三个项目而不是第二个项目。 - MakePeaceGreatAgain
没错,你说得对。我做了一个更改。 - Kędrzu

2
尝试这样做:
var source = _context.SourceLogs.Where(a => a.SourceID == user.ID).OrderBy(a => a.SourceID).Skip(1);

更新:如果您只想获取列表中的第二个项目,您可以在查询末尾添加 .First()
var source = _context.SourceLogs.Where(a => a.SourceID == user.ID).OrderBy(a => a.SourceID).Skip(1).First();

1
需要注意的是,这不会返回单个项目,而是一个包含一个项目的IEnumerable。 - Avner Shahar-Kashtan

1
你可以直接跳过第一个并从中获取第一个。
var source = _context.SourceLogs.Where(a => a.SourceID == user.ID).Skip(1).First()

-1

你可以使用

var source = _context.SourceLogs.Where(a => a.SourceID == user.ID).ToList();

然后方便地查询源列表


这不是一个好的通用解决方案。这将从数据库中提取与SourceId匹配的整个SourceLogs列表,而不仅仅是它们中的第一个。 - Avner Shahar-Kashtan
这就是为什么我说“方便的时候”,这将最小化对上下文的调用。 - Kareem Abou Saad
@AvnerShahar-Kashtan Skip会执行相同的操作,因此这不是真正的问题。但是它无法从列表中提取第二个项目。 - MakePeaceGreatAgain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接