结合列表中实体的两个属性并将其与 Linq 展平
Posted
技术标签:
【中文标题】结合列表中实体的两个属性并将其与 Linq 展平【英文标题】:Combine Two Properties From Entity In List And Flatten It With Linq 【发布时间】:2014-08-02 21:18:08 【问题描述】:我在下面的这个结构中有一个实体列表。如何在一次调用中使用 linq 创建所有 AwayTeamId
和 HomeTeamId
的 List<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 展平的主要内容,如果未能解决你的问题,请参考以下文章