c# - 递归 LINQ 调用

标签 c# linq

我正在尝试构建一些具有父子关系但在同一个表中的数据的 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/

相关文章:

c# - 为什么 linq 不实现完全懒惰?

c# - Linq Multiple OR 与列表

c# - Entity Framework 7 未配置数据库提供程序 => 当迁移移动到另一个项目时

c# - C#获取单个文件最近创建时间的路径

c# - DataGridView:如何使某些单元格不可选择?

c# - ASP.NET/LINQ/EF : Async on custom distinct comparer class

c# - 让 GetDecimal 发挥作用

c# - 在事件接收器中获取 SPContext

c# - 搜索可枚举的最有效方法

xml - 如何从 XML 文件中的特定节点获取值?