如何使用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排序。

如何使用Linq从列表中提取这些数据

我想你想要:

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过滤体操。