结合列表中实体的两个属性并将其与 Linq 展平

Posted

技术标签:

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

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

class Game 

   int AwayTeamId;
   int HomeTeamId;


【问题讨论】:

因此,如果您有 5 个 Game 实例,那么您的新列表中将有 10 个条目(假设它们都是不同的)? 是的,这就是我想要做的 【参考方案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)。

以上是关于结合列表中实体的两个属性并将其与 Linq 展平的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 展平列表列表以获取父/子列表

在捕获索引时使用 LINQ 展平列表

LINQ比较两个列表并将结果放入一个列表[重复]

选择特定实体 LINQ 的属性

使用 LINQ 获取两个比较列表的结果并根据结果更改列表中的属性

JavaFX:一次有2个独立的窗口