在C#中,递归获取父ID列表的最佳方法是什么?

时间:2016-09-27 20:47:12

标签: c# recursion

在C#中,我有一个团队对象。

  • 团队对象的 ID
  • 团队还有一个名为 Parent 的属性,它也是一个团队对象

我想弄清楚给定一个团队的方式,我有一个传递给该团队的函数并返回一个包含该团队ID的数组以及所有父项递归(父,祖父母,伟大的父母等)团队成员。

例如,假设我有以下团队

  • LowLevelTeam(id = 6)
  • NextLevelTeam(id = 10)
  • HighLevelTeam(id = 12)

所以如果我传入LowLevelTeam,这个函数会返回一个带有(6,10,12)的数组

如果我传入NextLevelTeam,此函数将返回一个数组(10,12)

如果我传入HighLevelTeam,此函数将返回一个数组(12)

在我的情况下,我有几百个"级别"但上面的例子应该突出显示请求。

2 个答案:

答案 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();
        }
    }
}