如何使用Linq从List中提取此数据?

时间:2012-02-29 12:13:40

标签: c# .net linq

我有以下列表..

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排序。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:7)

我想你想要:

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过滤体操像上面那些。