如何使用Linq从列表中提取这些数据
本文关键字:提取 数据 列表 何使用 Linq | 更新日期: 2023-09-27 18:26:11
我有以下列表:
Id: Game-1
GameType: Battlefield3
LogEntries: (an IList<LogEntry>)
- Id: 1, Foo: Blah blah blah..
- Id: 231, Foo: Blah blah blah..
- Id: 342321, Foo: Blah blah blah..
Id: Game-2
GameType: Battlefield3
LogEntries: null
Id: Game-1
GameType: Battlefield3
LogEntries: (an IList<LogEntry>)
- Id: 2121, Foo: Blah blah blah..
- Id: 21333321, Foo: Blah blah blah..
等等。因此,每个游戏服务器可以有0到多个日志条目。
现在,我正在尝试以以下格式获得结果。
IList<LogEntries> logEntries = <some linq magic>
Id: 1, Foo: Blah blah blah..
Id: 231, Foo: ....
Id: 2121, Foo: ....
Id: 342321, Foo: ....
Id: 342321, Foo: ....
因此,日志条目按Id排序。
我想你想要:
IList<LogEntries> logEntries = games.SelectMany(game => game.LogEntries ?? Enumerable.Empty<LogEntry>())
.OrderBy(logEntry => logEntry.Id)
.ToList();
这里的关键是SelectMany
运算符,它将每个游戏映射到其日志条目,使日志条目序列变平为一个简单的日志条目序列。
您也可以在查询语法中这样做:
var logEntries = from game in games
from logEntry in game.LogEntries ?? Enumerable.Empty<LogEntry>()
orderby logEntry.Id
select logEntry;
(您可以在上面调用ToList()
,将查询具体化为列表)。
不过,就我个人而言,我会更改Game
类型,使其LogEntries
属性永远不可能是null
,所以您不需要像上面那样使用null
过滤体操。