日期:2014-05-18  浏览次数:21007 次

挑战递归,求败贴。
数据表生成无级树,刚发布,地址:http://blog.csdn.net/xianfajushi/article/details/7756584

优点:任意定义树节顺序与级数,无无限循环之忧,速度比递归快。求败要求:发现树节错误,发现无法读取语法错误。

注明:目前不支持日期型数据和金额类数据进行筛选,需要的话自己写,或以后有遇到需求再补充。

欢迎测试指正,不吝赐教,不拒砸蛋丢菜。

------解决方案--------------------
接分。。。
楼主你是学术派的啊,全中文编程啊?
------解决方案--------------------
我上来就看到了:
玄龙戏珠无级树、父龙、母龙、子龙、龙珠...
------解决方案--------------------
怎么这样的习惯啊,真的不要用中文啊,我习惯了英文命名,看着中文特别的....
------解决方案--------------------
中文博大精深不适合简显的编程啊,编程还是用用简单的英文就好了- -
呵呵
jf
------解决方案--------------------
很多编程语言是不支持中文的,C#是个例外。
------解决方案--------------------
LZ悲剧了、
人家只是想讨论下技术、
没想到你们全抓"伪"bug去了、
------解决方案--------------------
不排斥這種寫法,存在即合理的,而且可讀性也很高,規則不是一成不變的。
------解决方案--------------------
中文咋了?总比那词不达意的蹩脚的伪英文名字好多了
------解决方案--------------------
没必要纠结命名。。
------解决方案--------------------
探讨
不排斥這種寫法,存在即合理的,而且可讀性也很高,規則不是一成不變的。

------解决方案--------------------
谈点实际的。
------解决方案--------------------
代码看不下去,实在有点难接受中文变量名,但是lz你用也没啥不好的。
不过用中文表字段名的时候建议加"[]",因为有时候有些数据库中间件或本身对中文支持没那么好。
之前拿到gis数据后我这边一个gis控件不支持中文表明结果很麻烦的修改了字段名。
可能的话生僻数据库还是沿用英文字段名。注意加上[]分隔符吧。
------解决方案--------------------
我还真认真的看了,LZ这是个坑啊,中文不适感就不说了,表结构没给,上来就一个datatable开始循环,又冒出个级的概念来,不知道,级在什么地方出来的,是表的级联查询出的级么,也不解释,“子龙”“母龙”什么蛋疼啊。上来就


节点.Text = 数据列[0].ToString();

if (!DateTime.TryParse(节点.Text, out 日期)) 子节数据 = 树表.Select(重组表列[0] + "='" + 节点.Text + "'");

数据列【0】是毛数据没说,为什么要判断 节点.Text 是否能成功转日期也不提,子节数据是所谓的树表select出来的,树表是数据表中的内容的defalutview.totable来的,表列是根据表名做的判断,所以其中的数据列【0】是所谓的“归属”“提示内容”“总类”,根据这个来的,我权且当它是个父节点id的意思吧。到了下面我就完败了,完全不知所谓。

=======================

说说我常用的非递归树生成,我通常是用oracle中的级联查询树表,来出一个树,来一个堆栈记录下当前父节点的全路径,循环一次完事。.net代码不超过三十行,缺点是兄弟节点的排序问题我没解决。我对级联查询研究的还不够啊.....有知道的告知一下
------解决方案--------------------


仁者见仁智者见智吧。
------解决方案--------------------
额,不多说啥,先上一段代码,lz比较一下差距有多大

C# code
  public static void makeTreeView<TSource, TID, TNode>(
           this IEnumerable<TSource> list,
           IEnumerable tds,        
           Func<TSource, TID> FunID,
           Func<TSource, TID> funParentID,
           Func<TSource, TNode> funConvert,  
            Func<TNode, IEnumerable> ChirldFun,
           decimal parentId = 0
           ) where TID : struct
        {

            var tlist = list.Where(c => Convert.ToDecimal(funParentID(c)) == parentId);
            foreach (var item in tlist)
            {
                TNode td = funConvert(item);
                dynamic d_tds = tds;
                d_tds.Add(td);
                list.makeTreeView(ChirldFun(td), FunID, funParentID, funConvert, ChirldFun,Convert.ToDecimal(FunID(item)));
            }
        }

------解决方案--------------------
探讨

额,不多说啥,先上一段代码,lz比较一下差距有多大