在C#中,我有一个团队对象。
我想弄清楚给定一个团队的方式,我有一个传递给该团队的函数并返回一个包含该团队ID的数组以及所有父项递归(父,祖父母,伟大的父母等)团队成员。
例如,假设我有以下团队
所以如果我传入LowLevelTeam,这个函数会返回一个带有(6,10,12)的数组
如果我传入NextLevelTeam,此函数将返回一个数组(10,12)
如果我传入HighLevelTeam,此函数将返回一个数组(12)
在我的情况下,我有几百个"级别"但上面的例子应该突出显示请求。
答案 0 :(得分:3)
非递归解决方案非常简单。
List<int> GetTeamAncestors(Team team)
{
var ancestors = new List<int>() {team.Id};
while (team.Parent != null) // how do I know if the team has a parent?
{
team = team.Parent;
ancestors.Add(team.Id);
}
return ancestors;
}
这是基本的想法。
答案 1 :(得分:1)
另一个解决方案是递归过程中的“yield return”,如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TeamTree
{
public class Team
{
public int Id { get; private set; }
public Team Parent { get; private set; }
public Team(int id, Team parent)
{
this.Id = id;
this.Parent = parent;
}
public IEnumerable<int> Teams()
{
yield return this.Id;
if (this.Parent != null)
foreach (int id in Parent.Teams())
yield return id;
}
}
class Program
{
static void Main(string[] args)
{
var highLevelTeam = new Team(12, null);
var nextLevelTeam = new Team(10, highLevelTeam);
var lowLevelTeam = new Team(6, nextLevelTeam);
Console.WriteLine(@"lowLevelTeam ({0})", lowLevelTeam.Teams().Aggregate("", (r, id) => r + ", " + id.ToString()).Substring(2));
Console.WriteLine(@"nextLevelTeam ({0})", nextLevelTeam.Teams().Aggregate("", (r, id) => r + ", " + id.ToString()).Substring(2));
Console.WriteLine(@"highLevelTeam ({0})", highLevelTeam.Teams().Aggregate("", (r, id) => r + ", " + id.ToString()).Substring(2));
Console.ReadLine();
}
}
}