我有以下列表..
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排序。
有人可以帮忙吗?
答案 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
过滤体操像上面那些。