我正在尝试使用父子关系构建一些数据的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.
不知道如何写一个递归的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)
| 归档时间: |
|
| 查看次数: |
6227 次 |
| 最近记录: |