【问题标题】:Assigning object properties based on a ternary conditional inside a linq query基于 linq 查询中的三元条件分配对象属性
【发布时间】:2019-08-27 12:45:27
【问题描述】:

在下面的代码中,我将从 API 检索到的数据分配给名为 groupedGamesListing 的变量。

使用该变量,我将选择数据并创建一个名为 GroupedGames 的新对象。

我让它工作了,但现在我试图引入一个名为 GameControllerId 的新属性。

我需要 GameControllerId 是两个数字之一,具体取决于年份。

我开始编写代码,但不知道如何在 lambda 表达式中表示 if/then 或三元运算符。

这是我正在使用的。

var groupedGamesListing = apiResults.Select(games => new GroupedGames
{
   // ...
   GameId = games.Select(g => g.CurrentGameId).FirstOrDefault().ToString(),
   GameControllerId = games.Select(g => { (g.GameYear == 2018) ? 34729 : 99483  }),
   // ...
}).ToList();

所以如果 g.GameYear 是 2018,那么我需要 GameControllerId 为 34729。如果不是,则为 99483。

这可能在上面的表达式中吗?

谢谢!

【问题讨论】:

  • games几场 场比赛 - 如果一个是 2018 年的,一个是 2017 年的,你还不清楚你要选择什么价值。
  • 您要选择所有游戏的GameControllerId 还是只选择1 个?
  • @SkyeBoniwell 如果你只对第一个游戏感兴趣,为什么不先选择它,然后提取你需要的属性呢?
  • 所以你不在乎不同的游戏有不同的年份?你乐意拿第一吗?请注意,使用GameId = games.FirstOrDefault()?.CurrentGameId?.ToString() 更简单
  • 对于GameControllerId,如果没有任何游戏,您希望结果是什么?

标签: c# linq


【解决方案1】:

我不确定您的确切用例,但您可以考虑

var groupedGamesListing = apiResults.SelectMany(g => new GroupedGames
    {
        // ...
        GameId = g.CurrentGameId.ToString(),
        GameControllerId = (g.GameYear == 2018) ? 34729 : 99483,
        // ...
    }).ToList();

看起来您可能会遇到apiResults 是列表列表的问题,因此这会使原始对象变平。

【讨论】:

  • 谢谢。这很好用!我不得不稍微改变一下声明,但最后,它现在更干净并且按预期工作。
  • 请注意,这可以通过将 .SelectMany(x => x).Select(g => { 替换为 .SelectMany(g => { 来轻松简化
  • @JonSkeet 这是一个很好的观点。我会更新答案。
  • 更好。接下来,您当然可以将其设为表达式主体的 lambda:SelectMany(g => new GroupedGames { ... }) :)
  • 不敢相信我得到 Jon Skeet 和 @EricLippert 一天之内回复我:D 星期五快乐
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多