2012-02-29 68 views
1

我有以下的列表..如何使用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排序。

任何人都可以帮忙吗?

+2

当您发布(简化)类定义时,回答会变得更容易。 – 2012-02-29 12:18:51

回答

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过滤体操像以上这样的。