Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取父节点的所有子节点?_C#_Recursion - Fatal编程技术网

C# 如何获取父节点的所有子节点?

C# 如何获取父节点的所有子节点?,c#,recursion,C#,Recursion,我的DTO如下所示: class TreeLevel { public long Id { get; set; } public long? ParentId { get; set; } } 我有一个简单的DTO列表: var list = new List<TreeLevel>() { new TreeLevel { Id=1, ParentId=null

我的DTO如下所示:

 class TreeLevel
 {
        public long Id { get; set; }
        public long? ParentId { get; set; }
 }
我有一个简单的DTO列表:

var list = new List<TreeLevel>() {
            new TreeLevel  {
               Id=1,
               ParentId=null
            },
            new TreeLevel{
                Id=2,
                ParentId=1
            },
            new TreeLevel{
                Id=3,
                ParentId=1
            },
            new TreeLevel{
                Id=4,
                ParentId=2
            },
            new TreeLevel{
                Id=5,
                ParentId=8
            },
            new TreeLevel{
                Id=6,
                ParentId=null
            },
            new TreeLevel{
                Id=7,
                ParentId=null
            },
            new TreeLevel{
                Id=8,
                ParentId=4
            },
            new TreeLevel{
                Id=9,
                ParentId=10
            },
            new TreeLevel{
                Id=10,
                ParentId=8
            }
        };

我怎样才能做到这一点?谢谢

如果找到优化的方法,将更新答案,现在就完成它的工作

var allNodes = new List<TreeLevel>();
var parentNodes = list.Where(x => x.Id == 8).ToList();

do
{
    foreach (var item in parentNodes) 
    {
        list.Remove(item); // to avoid loops in graph
    }

    var childNodes = new List<TreeLevel>();

    foreach (var parentId in parentNodes.Select(x => x.Id).Distinct())
    {
        childNodes.AddRange(list.Where(x => x.ParentId == parentId));
    }

    allNodes.AddRange(childNodes);
    parentNodes = childNodes;

} while (parentNodes.Any());
var allNodes=new List();
var parentNodes=list.Where(x=>x.Id==8.ToList();
做
{
foreach(父节点中的变量项)
{
list.Remove(item);//避免图形中的循环
}
var childNodes=新列表();
foreach(parentNodes.Select(x=>x.Id).Distinct()中的var parentId)
{
AddRange(list.Where(x=>x.ParentId==ParentId));
}
AddRange(childNodes);
parentNodes=childNodes;
}while(parentNodes.Any());

将更新答案,如果找到优化它的方法,现在就完成它的工作

var allNodes = new List<TreeLevel>();
var parentNodes = list.Where(x => x.Id == 8).ToList();

do
{
    foreach (var item in parentNodes) 
    {
        list.Remove(item); // to avoid loops in graph
    }

    var childNodes = new List<TreeLevel>();

    foreach (var parentId in parentNodes.Select(x => x.Id).Distinct())
    {
        childNodes.AddRange(list.Where(x => x.ParentId == parentId));
    }

    allNodes.AddRange(childNodes);
    parentNodes = childNodes;

} while (parentNodes.Any());
var allNodes=new List();
var parentNodes=list.Where(x=>x.Id==8.ToList();
做
{
foreach(父节点中的变量项)
{
list.Remove(item);//避免图形中的循环
}
var childNodes=新列表();
foreach(parentNodes.Select(x=>x.Id).Distinct()中的var parentId)
{
AddRange(list.Where(x=>x.ParentId==ParentId));
}
AddRange(childNodes);
parentNodes=childNodes;
}while(parentNodes.Any());

我在下面编写了TraverseTree例程,该例程递归遍历树并将结果作为IEnumerable返回



我在下面编写了TraverseTree例程,该例程递归遍历树并将结果作为IEnumerable返回



你试过什么了吗?你到底被困在哪里?结果可能是5,10,9?@LasseV.Karlsen是的,因为5的父母是8,10的父母是8,9的父母是10。10的父母是8岁。所以所有的孩子都必须是5,9,10岁你试过什么了吗?你到底被困在哪里?结果可能是5,10,9?@LasseV.Karlsen是的,因为5的父母是8,10的父母是8,9的父母是10。10的父母是8岁。因此,所有儿童必须是5,9,10岁
using System;
using System.Collections.Generic;
using System.Linq;

namespace GetAllChildren
{
    class Program
    {
        static void Main(string[] args)
        {
            var list = new List<TreeLevel>()
            {
                new TreeLevel  { Id=1, ParentId=null },
                new TreeLevel{ Id=2, ParentId=1 },
                new TreeLevel{ Id=3, ParentId=1 },
                new TreeLevel{ Id=4, ParentId=2 },
                new TreeLevel{ Id=5, ParentId=8 },
                new TreeLevel{ Id=6, ParentId=null },
                new TreeLevel{ Id=7, ParentId=null },
                new TreeLevel{ Id=8, ParentId=4 },
                new TreeLevel{ Id=9, ParentId=10 },
                new TreeLevel{ Id=10, ParentId=8 }
            };

            var result = TraverseTree(list, 8).ToList();

            for (int i = 0; i < result.Count(); i++)
            {
                Console.WriteLine($"{result[i].Id} - {result[i].ParentId}");
            }

            Console.ReadKey();
        }

        private static IEnumerable<TreeLevel> TraverseTree(List<TreeLevel> list, long id)
        {
            return list
                .Where(child => child.ParentId == id)
                .Union(list.Where(child => child.ParentId == id)
                .SelectMany(parent => TraverseTree(list, parent.Id))
            );
        }
    }

    class TreeLevel
    {
        public long Id { get; set; }
        public long? ParentId { get; set; }
    }
}
5 - 8
10 - 8
9 - 10