作者tomex (Tomex Ou)
看板C_Sharp
标题[原创]递回式巡览列(手工SiteMapPath)
时间Sun Oct 7 03:27:59 2007
所谓的「SiteMapPath」,在ASP.NET 2.0即为下图的红框部分:
http://img248.imageshack.us/img248/4909/forumnavigatorbn3.gif
它是一个称为「SiteMapPath」的控制项,读取XML档的阶层语法来达成
可以动态修改节点的内容,但要新增/删除节点则不知如何下手
我未使用过,只是单纯看一下google资料就猜它的轮廓
即使绑在来源SiteMapPath.DataSource,好像要控制节点也很麻烦
因为就算能读取,阶层式怎麽表达就让程式师手软。
很多书上有写SiteMapPath范例,但我猜书上一定会避重就轻
即已有xml的节点,只是单纯切换既有节点而己 (不写技术重点就是中文书的毛病)。
既然没有现有资源可轻取,所以我回到原始概念去挑战这种类似递回式的path写法,
首先,我利用ParentId让这样的阶层关系能用单一SQL table就能表达
接着为了效能考量,我一次全部下载所有清单(只作1次sql撷取远端资料),
利用DataTable.Select()在记忆体中取出相关的record,
再透过递回函式一一找出每个节点的父亲,
形成parent-child的表达方式。
读大学时,对资料结构的递回(recursive)程式实在是看不懂,
到了职场为了避重就轻,还是不太会写
後来function重复呼叫实在太多次了,需要用递回的需求清楚得不得了
真正去实作递回,发现只要rule很清楚,它根本就是简单且直觉的写法
只要留意最後一次exit的时机即可。
但我还是讨厌递回method,并不是它难,而是它在整体工作未完成时
并不会释放method内的区域变数宣告资源,
若是自呼太多阶,记忆体可能就不够用了 (假如method需要耗很多记忆体的话)
除此之外,只要用心去使用递回,它真是不难!
我们都被大学时代的书本给吓得不敢去思考其原意了。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.115.133.93