递归算法,如何把list中父子类对象递归成树
以前写代码for循环写的多,递归除了在大学学习以外,真没怎么用过!
最近项目中使用到了关于族谱排列的问题,就是怎么把数据库里的多个子父类people对象,在界面中用树的结构展示出来
假设数据库中people有两个字段分别是ID和 ParentId(当然设计的时候肯定会有familypath,rootID之类的字段,这里为了方便介绍就只用俩字段)
话不多说直接上代码吧
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication4
{
public class TestModel
{
public void test()
{
#region 添加测试数据
List<People> listP = new List<People>();
for (int i = ; i < ; i++)
{
listP.Add(new People()
{
ParentId = ,
id =
});
}
for (int i = ; i < ; i++)
{
listP.Add(new People()
{
ParentId = ,
id = i + ,
});
}
for (int i = ; i < ; i++)
{
listP.Add(new People()
{
ParentId = ,
id = i + ,
});
}
for (int i = ; i < ; i++)
{
listP.Add(new People()
{
ParentId = ,
id = i + ,
});
}
#endregion 上面是添加测试数据 //查询当前节点下的所有子孙对象
var currentP = new People();
currentP.id = ;
//递归完成后,此处currentP,就添加好了子孙类节点
Recursion(listP, currentP);
//then
//展示currentP
}
public void Recursion(List<People> list,People p)
{
if(list==null||list.count==0)
{
return;
}
List<People> peoples = new List<People>();
for (int i = ; i < list.Count; i++)
{
//递归必须要有跳出节点,此处为了不断向下查找子节点
if (list[i].ParentId == p.id)
{
peoples.Add(list[i]);
p.PeopleList = peoples;
Recursion(list, list[i]);
}
}
}
}
public class People
{
public List<People> PeopleList;
public int ParentId;
public int id;
}
}
呐,就这么简单,看到同事不断用for循环来一级推一级,我头都大了,写的太麻烦。递归虽然很简单,但是也要花点时间思考。
递归算法,如何把list中父子类对象递归成树的更多相关文章
- 全面了解python中的类,对象,方法,属性
全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
- C++中派生类对象的内存布局
主要从三个方面来讲: 1 单一继承 2 多重继承 3 虚拟继承 1 单一继承 (1)派生类完全拥有基类的内存布局,并保证其完整性. 派生类可以看作是完整的基类的Object再加上派生类自己的Objec ...
- C++中基类对象的引用
代码: #include <iostream> #include <cstdio> using namespace std; class A{ public: void pri ...
- 理解Python中的类对象、实例对象、属性、方法
class Animal(object): # 类对象 age = 0 # 公有类属性 __like = None # 私有类属性 def __init__(self): # 魔法方法 self.na ...
- 关于c++11中static类对象构造函数线程安全的验证
在c++11中,static静态类对象在执行构造函数进行初始化的过程是线程安全的,有了这个特征,我们可以自己动手轻松的实现单例类,关于如何实现线程安全的单例类,请查看c++:自己动手实现线程安全的c+ ...
- python中自定义类对象json字符串化的方法
1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...
- c++中string类对象和字符数组之间的相互转换
string类在c++中是一个模板类,位于名字空间std中,注意这里不是string.h,string.h是C字符串头文件. 将string类型转换为字符数组char arr[10];string s ...
- c#中创建类(更新中)
类是最常见的一种引用类型,最简单的定义如下 class YouClassNam {} 复杂的类可能包含一下内容 类属性 类属性以及类修饰符. 非嵌套的类修饰符有:public,internal,ab ...
- C++中的类继承(4)继承种类之单继承&多继承&菱形继承
单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承.这种继承方式使一个子类可 ...
随机推荐
- Big Number-Asia 2002, Dhaka (Bengal) (计算位数)题解
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- UVa 1347 旅行
https://vjudge.net/problem/UVA-1347 思路:用d(i,j)表示第一个人走到i,第二个人走到j,还需要走多长的距离.在这里强制定义i>j,并且每次只能走到i+1. ...
- UVa 1411 Ants(分治)
https://vjudge.net/problem/UVA-1411 题意:n只蚂蚁和n颗苹果树,一一配对并且不能交叉. 思路:这就是巨人与鬼的问题.用分治法就行了. #include<ios ...
- Android广播接收器里弹出对话框
不多说,直接上车... public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(fina ...
- django模型的继承
很多时候,我们都不是从‘一穷二白’开始编写模型的,有时候可以从第三方库中继承,有时候可以从以前的代码中继承,甚至现写一个模型用于被其它模型继承.这样做的好处,我就不赘述了,每个学习Django的人都非 ...
- LRU缓存淘汰算法
什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用,在有限的内容块中存储最近使用次数最多的数据,当内容块已满时,把最少使用的数据删除以便存储新的内容.
- Python string常用函数
2017-07-03 23:26:08 1..replace(self, old, new, count=-1) replace()函数将旧字符串替换为新字符串,最后一个参数count为可选项,表示替 ...
- yii新手在实例化models(controller调用models实化化)php warning错误
新手在执照yii教程来的时候,config/main.php文件是全新写的,post提交的时候,会出错 include(LoginForm.php) [<a href='function.inc ...
- English trip -- VC(情景课)1 C What's your name?(review)
Xu言: 今天,阴差阳错又上了一次 VC 1 C的课,不过这次是小班的形式.这次课的教室叫 toronto [təˈrɒntəʊ] to ron to (多伦多(加拿大城市)) - -0我还 ...
- LeetCode--067--二进制求和
问题描述: 给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1&quo ...