TreeBuilder科学的树创建器
public static class TreeBuilder
{
public static List<dynamic> Build(IEnumerable<dynamic> collection, Func<dynamic, int, dynamic> parser, Func<dynamic, bool> rootSelector, Func<dynamic, dynamic, int, bool> childrenSelector)
{
if (collection != null && parser != null && rootSelector != null && childrenSelector != null)
{
var roots = collection.Where(rootSelector).Select(item => parser(item, )).ToList();
roots.ForEach(node => { BuildChildren(collection, node, parser, , childrenSelector); });
return roots;
}
return null;
} private static void BuildChildren(IEnumerable<dynamic> collection, dynamic parent, Func<dynamic, int, dynamic> parser, int level, Func<dynamic, dynamic, int, bool> childrenSelector)
{
var children = collection.Where(t => childrenSelector(t, parent, level)).Select(item => parser(item, level)).ToList();
if (children != null && children.Count > )
{
parent.state="closed";
parent.children=children;
children.ForEach(node => { BuildChildren(collection, node, parser, level + , childrenSelector); });
}
}
}
示例:
string sql = @"SELECT [Id]
,[PId]
,[Name]
,[OfficeTel]
,[Fax]
,[SafeTel]
,[MSTel]
,[ElectricTel]
,[Order]
,[Type]
FROM [NEMS].[dbo].[ContactInfo] where [type]=@type order by [Order] ";
BatchDataHelper helper = new BatchDataHelper("NEMSConnString");
var list = helper.Query(sql, new List<KeyValuePair<string, object>>() { new KeyValuePair<string, object>("type", type) });
var tree = TreeBuilder.Build(list, (d, i) =>
{
d.Level = i; return d;
}, d => d.PId == , (d, n, i) => n.Id == d.PId);
参数一为构件树的数据集合,参数二为树节点转化委托,参数三为根节点选择器,参数四是父子关系选择器.
TreeBuilder科学的树创建器的更多相关文章
- 【Unity】4.5 树木创建器
分类:Unity.C#.VS2015 创建日期:2016-04-11 一.简介 在地形编辑器一节中,已经告诉了你如何使用已经创建好的树来形成大片树林.这一节告诉你在 Unity 5.3.4中如何利用[ ...
- C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制
在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...
- Responsive Web CSS – 在线响应式布局创建器
如果您已经使用了 CSS 或前端框架,创建响应式布局应该不难. 然而,如果你刚涉足这类布局,Responsive Web CSS 可以帮助你快速上手. 这是一个基于 Web 的工具,使任何人都可以通过 ...
- ubuntu 启动项创建器 选择不了CD镜像,IOS镜像的解决方法
自己系统是ubuntu14.04 , 想使用 ubuntu自带的启动项创建器(usb-creator-gtk)做一个CDLinux的U盘启动项, 打开程序后发现U盘识别了, 在添加镜像的时候,发现怎么 ...
- Spring 中如何自动创建代理(spring中的三种自动代理创建器)
Spring 提供了自动代理机制,可以让容器自动生成代理,从而把开发人员从繁琐的配置中解脱出来 . 具体是使用 BeanPostProcessor 来实现这项功能. 这三种自动代理创建器 为:Bean ...
- C# 反射的委托创建器
原文:C# 反射的委托创建器 .Net 的反射是个很好很强大的东西,不过它的效率却实在是不给力.已经有很多人针对这个问题讨论过了,包括各种各样的 DynamicMethod 和各种各样的效率测试,不过 ...
- C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现
今天做一个管理后台菜单,想着要用无限极分类,记得园子里还是什么地方见过这种写法,可今天找了半天也没找到,没办法静下心来自己写了: 首先创建节点类(我给它取名:AdminUserTree): /// & ...
- python 根据现有文件树创建文件树
# -*- coding: utf-8 -*- import os, errno def fileName(path):#获取文件夹 str = '' for i in range(1,len(pat ...
- C# 表达式树 创建、生成、使用、lambda转成表达式树~表达式树的知识详解
笔者最近学了表达式树这一部分内容,为了加深理解,写文章巩固知识,如有错误,请评论指出~ 表达式树的概念 表达式树的创建有 Lambda法 和 组装法. 学习表达式树需要 委托.Lambda.Func& ...
随机推荐
- 没有公网IP的服务器如何通过有公网的服务器实现远程管理的功能?即VPN服务器搭建过程
由于很多PPPoE帐号都没有公网IP了,那我们如何实现远程管理呢? 答案是比较简单的,首先,你要拥有一台有公网IP的路由器,其他品牌的也可以,但是下面我以WayOs作为VPN服务器,给大家一个教程. ...
- TortoiseSVN and TortoiseGit 版本控制图标不见了
突然有一天,代码文件夹上的版本控制图标不见了. 注册表中,将文件夹名重命名,让版本控制的靠前,Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft ...
- [译] 一、为何要推出AppCoda系列?
声明:本文翻译自AppCoda网站的文章:Why Launching AppCoda?,作者是创建者Simon Ng.如有异议,请联系博主. 去年九月份,我在App Store上发布了自己第一个iPh ...
- iOS 自定义滑动切换TabBar
貌似经常会用到,自己整理收藏起来,方便日后查找备用. 效果如图: 由于制作gif,调整了属性,所以看起来的效果不好.如果用默认配置,生成的gif会很大. 制作gif: 1.使用QuickTimePla ...
- SAP S4 Finance6个支持企业实时财务管理的主要创新领域
本文将讲述下 SAP Simple Finance里面6个支持企业实时财务管理的主要创新领域. Simple Finance 在以下几个方面具有自己独特的优势: ● 更加简洁的用户体验,可以让用户在任 ...
- apache 配置反向代理服务器
前几天实验了下 nginx 配置反向代理服务器.虽然 nginx 的安装很麻烦,但是用起来倒是很简单.不过组里没人用过 nginx,apache 服务器大家倒是蛮熟,为了减少 ops team 的工作 ...
- JAVA中关于数组的定义
前些日子,有网友问:在JAVA中 int[] a 这样定义的数组和 int a[] 定义的数组有什么区别? 当时没有细看,直接回复说,在JAVA中,两者是一样的,没有区别. 回头仔细看时,还是稍有区别 ...
- 基于HTML5的Web跨设备超声波通信方案
前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信.蓝牙配对.IM来传送数据.它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享. 此外支付宝曾 ...
- 【Xamarin报错】visual studio android 模拟器部署卡住
模拟器启动成功,但是部署一直等待中,没有反应. 1>Starting deploy 5" KitKat (4.4) XXHDPI Phone ...1>Starting emul ...
- linux下mysql的root密码忘记解决方法
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...