我正在尝试构建一些具有父子关系但在同一个表中的数据的 XML 树。
两个重要的领域是
竞赛编号 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
};
更新
我发现了 Chris Eargle 的一篇有趣文章 here这向您展示了如何递归调用 lambda 委托(delegate)。这是代码。谢谢克里斯!
Func<int, int> factoral = x => x <= 1 ? 1 : x + factoral(--x);
Func<int, int> factoral = null;
factoral = x => x <= 1 ? 1 : x + factoral(--x);
^ 添加了代码格式以显示 lamba 函数 诀窍是首先将 null 分配给 Func 委托(delegate)。
最佳答案
不知道如何编写递归 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];
根变量现在包含完整的树。
这是一个完整的测试示例:
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];
}
}
}
关于c# - 递归 LINQ 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2708160/