【问题标题】:Combine Two Properties From Entity In List And Flatten It With Linq结合列表中实体的两个属性并将其与 Linq 展平
【发布时间】:2014-08-02 21:18:08
【问题描述】:

我在下面的这个结构中有一个实体列表。如何在一次调用中使用 linq 创建所有 AwayTeamIdHomeTeamIdList<int> 的不同列表?我知道我可以在 HomeTeamId 上进行选择并获得所有这些,但我还需要包含 AwayTeamId。

class Game {

   int AwayTeamId;
   int HomeTeamId;

}

【问题讨论】:

  • 因此,如果您有 5 个 Game 实例,那么您的新列表中将有 10 个条目(假设它们都是不同的)?
  • 是的,这就是我想要做的

标签: c# asp.net .net linq flatten


【解决方案1】:

假设您只是在一个包含所有球队 ID(主场或客场)的平面列表之后,那么 UNIONing 两个 SELECT 怎么样?

var teamIds = games.Select(g => g.HomeTeamId).Union(games.Select(g => g.AwayTeamId));

[games 是我上面示例中的Game 实体列表]

【讨论】:

  • 只是一个想法 - 如果有重复的主队或客队 ID 怎么办?所以 (1, 2), (1, 3), (2, 1) - Union 不会过滤掉重复的 AwayId 而不是重复的 HomeId?
  • @DanielKelley - 不 - 它区分整个结果列表,从而删除列表或列表联合中的项目。
  • @RobLevine 很有趣。我今天学到了一些新东西 - 谢谢!
【解决方案2】:

这将起作用:

var result = entityContext.ListOfGames
      .Select(p=>new List<int>{p.AwayTeamId, p.HomeTeamId})
      .SelectMany(p=>p).Distinct();

如果是 LINQ to ENTITY,您需要在 ListOfGames 之后调用 .ToList(),以使该解决方案有效

【讨论】:

    【解决方案3】:

    Uriil 的回答可能会更短:

    var result = games
        .SelectMany(game => new[] { game.AwayTeamId, game.HomeTeamId })
        .Distinct()
    ;
    

    无需为每条游戏记录创建额外的 .Select 和列表。

    【讨论】:

    • 不错。打电话给Distinct 怎么样?
    • 对于移除不同的值没有严格的要求。只是“所有的 AwayTeamId”,但 distinct 可以删除非唯一的,因此我们得到的不是“全部”。
    • 好吧,提问者接受了一个消除欺骗的答案,而另一个答案也消除了欺骗。反正没关系。
    • 我不喜欢这样,因为它会导致堆数组分配 (new[])。
    • @Dai,你说得对。它比 Uriil 的答案要快(5.57±0.10 vs 8.99±0.12),但比 Rob 的联合要慢得多(3.53±0.07)。
    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多