c# - 如何使用 Linq 从列表中提取这些数据?

标签 c# .net 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 排序。

最佳答案

我想你想要:

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 像上面那样过滤体操。

关于c# - 如何使用 Linq 从列表中提取这些数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9498976/

相关文章:

c# - 如何在 Visual Studio 中打开特殊的 Ascii 字符?

c# - 如何轻松使这个计数器属性线程安全?

c# - 如何在没有 INotifyPropertyChanged 的​​情况下生成 Web 服务引用?

c# - DateTime 按日期或小时分组

c# - System.Linq.Dynamic 错误 类型 'StringComparison' 中不存在属性或字段 'Person'

c# - 使用 C# 在运行时合并两个对象的最佳方法是什么?

c# - 如何在列表中列出具有不为空的字段的元素编号?

c# - 英孚流利 API : Set property for each entity derived from a base abstract class

c# - 从 Orchard CMS 的仪表板添加数据记录

.net - 如何从 SQL 返回一页结果?