2012-02-29 7 views
1

私は、したがって、各ゲームサーバは、多くのログエントリに0を持つことができます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.. 

など ...以下のリストを持っています。

今、私は次の形式で結果を取得しようとしています。

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

クラス定義を投稿(単純化)すると、回答がずっと簡単になります。 –

答えて

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()を呼び出すことができます)。個人的に

しかし、私はそのLogEntriesプロパティがnullことができませんでしたようGameタイプを変更しますので、あなたは、上記のもののようなnullフィルタリング体操に頼る必要はありません。

関連する問題