2012-02-29 69 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過濾體操像以上這樣的。