递归LINQ调用

Vin*_*cio 15 c# linq

我正在尝试使用父子关系构建一些数据的XML树,但是在同一个表中.

这两个重要领域是

CompetitionID ParentCompetitionID

有些数据可能是

CompetitionID = 1,ParentCompetitionID = null

CompetitionID = 2,ParentCompetitionID = 1

CompetitionID = 3,ParentCompetitionID = 1

我破坏的查询只是以平面格式显示结果.看到我正在使用XML,需要某种递归功能.我可以使用普通的for循环递归来做到这一点,但是想看看linq版本.任何帮助赞赏.

var results = 
        from c1 in comps
        select new {
            c.CompetitionID,
            SubComps=
                from sc in comps.Where (c2 => c2.CompetitionID == c1.CompetitionID)
                select sc
        };
Run Code Online (Sandbox Code Playgroud)

更新

我在这里找到了一篇有趣的文章Chris Eargle ,它向您展示了如何递归调用lambda委托.这是代码.谢谢克里斯!

Func<int, int> factoral = x => x <= 1 ? 1 : x + factoral(--x);

Func<int, int> factoral = null;

factoral = x => x <= 1 ? 1 : x + factoral(--x);
Run Code Online (Sandbox Code Playgroud)

^添加代码格式以显示lamba函数诀窍是首先为Func委托指定null.

Fed*_*dor 6

不知道如何写一个递归的LINQ.但我认为这里实际上不需要递归.只需两步即可构建一棵树:

Dictionary<int, Competition> dic = comps.ToDictionary(e => e.CompetitionID);
foreach (var c in comps)
    if (dic.ContainsKey(c.ParentCompetitionID))
        dic[c.ParentCompetitionID].Children.Add(c);
var root = dic[1];
Run Code Online (Sandbox Code Playgroud)

根变量现在包含完整的树.

这是一个完整的测试样本:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication2
{
    class Competition
    {
        public int CompetitionID;
        public int ParentCompetitionID;
        public List<Competition> Children=new List<Competition>();
        public Competition(int id, int parent_id) 
        { 
            CompetitionID = id; 
            ParentCompetitionID = parent_id; 
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Competition> comps = new List<Competition>()
            {
                new Competition(1, 0), 
                new Competition(2,1),
                new Competition(3,1),
                new Competition(4,2),
                new Competition(5,3)
            };

            Dictionary<int, Competition> dic = comps.ToDictionary(e => e.CompetitionID);
            foreach (var c in comps)
                if (dic.ContainsKey(c.ParentCompetitionID))
                    dic[c.ParentCompetitionID].Children.Add(c);
            var root = dic[1];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)