gpt4 book ai didi

c# - LINQ 递归查询返回分层组集

转载 作者:太空狗 更新时间:2023-10-29 21:44:57 25 4
gpt4 key购买 nike

给定以下模型的列表

public class Team
{
public int TeamId { get; set; }
public int ParentTeamId { get; set; }
}

我正在尝试编写一个递归 linq 查询,它将使我能够检索如下所示的层次结构

Team
ChildTeams
Team
Team
ChildTeams

我尝试了很多方法,也看到了很多类似的问题,但没有一个能具体帮助我解决问题。我尝试的最新尝试是沿着这些路线进行的:

private class TeamGrouping
{
public int? ParentTeamId { get; set; }
public IEnumerable<Team> ChildTeams { get; set; }
public IEnumerable<TeamGrouping> Grouping { get; set; }
}

private IEnumerable<TeamGrouping> ToGrouping(IEnumerable<Team> teams)
{
return teams.GroupBy(t => t.ParentTeamId, (parentTeam, childTeams) => new TeamGrouping {ParentTeamId = parentTeam, ChildTeams = childTeams});
}

private IEnumerable<TeamGrouping> ToGrouping(IEnumerable<TeamGrouping> teams)
{
return teams.GroupBy(t => t.ParentTeamId, (parentTeam, childTeams) => new TeamGrouping{ParentTeamId = parentTeam, Grouping = childTeams});
}

我会将团队列表传递给第一个 ToGrouping(IEnumerable<Team>)然后随后返回的组到 ToGrouping(IEnumerable<TeamGrouping>)但这会产生不正确的结果。

有人有什么建议或想法吗?

最佳答案

首先,您的 TeamGrouping 实际上比需要的复杂一点。它所需要的只是 Team 对象和它自己的子序列:

public class TeamNode
{
public Team Value { get; set; }
public IEnumerable<TeamNode> Children { get; set; }
}

接下来,我们将采用我们的团队序列并为每个团队创建一个节点。然后我们将使用 ToLookup 按父 ID 对它们进行分组。 (您对 GroupBy 的使用非常接近于此,但是 ToLookup 会更容易。)最后我们可以将每个节点的子节点设置为该节点的查找值(请注意,如果键不存在,ILookup 将返回一个空序列,因此我们的叶子将得到完美处理)。为了完成它,我们可以通过查找父 ID 为 null 的所有节点来返回所有顶级节点。

public static IEnumerable<TeamNode> CreateTree(IEnumerable<Team> allTeams)
{
var allNodes = allTeams.Select(team => new TeamNode() { Value = team })
.ToList();
var lookup = allNodes.ToLookup(team => team.Value.ParentTeamId);
foreach (var node in allNodes)
node.Children = lookup[node.Value.TeamId];
return lookup[null];
}

关于c# - LINQ 递归查询返回分层组集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20004587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com