2012-02-29 4 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: .... 

Таким образом, записи в журнале упорядочены по идентификатору.

Может ли кто-нибудь помочь?

+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() на выше материализовать запрос списка).

Лично, хотя, я бы изменить Game тип такой, что его свойство LogEntries никогда не может быть null, так что вам не нужно прибегать к null фильтрации гимнастики, как те выше.

Смежные вопросы