递归和循环---从EasyUI Tree 发现自己的硬伤
2015-07-31 21:33
447 查看
递归和循环---从EasyUI Tree 发现自己的硬伤
前一阵子,朋友托我帮忙用vb.net写一个数独游戏,我当时的第一个想法---万能的互联网肯定有资源,肯定有人写---当然这是必须的---我站在巨人的肩膀上帮朋友完成代码---但是我突然觉得自己站在巨人这么高的肩膀上太高耸,想要找一下脚踏实地的感觉,所以我想自己写写,看看能不能写出来,结果就是------我压根没有思路。
对,毫不夸张,无从下手。
更深刻的一件事就是项目中用的的树状结构(easyui tree 实现),同样是根据数据库动态生成,我站在巨人的肩膀上,看着网上类似的datatable转json拼接,很简单很简单的只是用到了一个循环,一个递归,可是把代码真正应用于我们的系统,我整整用了一天的时间,整整一天只写了一个循环,一个递归。
写出来的那一刻要多美好有多美好,更重要的是我写完一个接下来一口气又写了三个,更更重要的是我发现自己循环和递归还有数学逻辑编程这方面是硬伤啊,然后接下来最最重要的一条:都是自己吓唬自己罢了,这才是硬伤。
天天骗自己循环递归,算法自己不会写,写不好所以每次遇到循环递归算法都想着绕开走,想着让别人写吧,我是真的不会啊种种,哎呀呀白接受米总的教育了。。到现在还这样自己骗自己。
真的没什么难的,所谓的难不过是自己告诉自己难,不过是自己给自己设立的围墙。
最后献上datatable转easyui treejson 的代码,大家不要见笑,就是这么简单。
ps:代码注释不是没有而是给去掉了,没有挑战简直没意思
public static string DatatableToJsonUserRoleTree(DataTable dt, string pid, string pvalue, string id, string name, int flag)
{
StringBuilder sb = new StringBuilder();
DataTable chdt = GetChildren(int.Parse(pvalue));
string filter = String.Format(" {0}='{1}'", pid, pvalue);
DataRow[] drs = dt.Select(filter);
if (drs.Length < 1 && chdt.Rows.Count < 1)
{
return "";
}
if (drs.Length >= 1 || chdt.Rows.Count >= 1)
{
sb.Append(",\"children\":[");
if (chdt.Rows.Count >= 1)
{
foreach (DataRow chdrs in chdt.Rows)
{
int groupid = int.Parse(chdrs["group_id"].ToString());
sb.Append("{");
sb.AppendFormat("\"id\":\"{0}\",", chdrs["group_id"].ToString());
sb.AppendFormat("\"text\":\"{0}\"", chdrs["group_name"].ToString());
DataTable userdt = GetUserByGroup(groupid);
if (userdt.Rows.Count >= 1)
{
sb.Append(",\"children\":[");
foreach (DataRow userdrs in userdt.Rows)
{
sb.Append("{");
sb.AppendFormat("\"user_id\":\"{0}\",", userdrs["user_id"].ToString());
sb.AppendFormat("\"text\":\"{0}\"", userdrs["user_name"].ToString());
sb.Append("},");
}
if (sb.ToString().EndsWith(","))
{
sb.Remove(sb.Length - 1, 1);
}
sb.Append("]");
}
sb.Append("},");
}
}
if (drs.Length >= 1)
{
foreach (DataRow dr in drs)
{
string spid = dr[id].ToString();
sb.Append("{");
sb.AppendFormat("\"id\":\"{0}\",", dr[id].ToString());
sb.AppendFormat("\"text\":\"{0}\"", dr[name].ToString());
sb.Append(DatatableToJsonUserRoleTree(dt, pid, spid, id, name, 0).TrimEnd(','));
sb.Append("},");
}
}
}
if (sb.ToString().EndsWith(","))
{
sb.Remove(sb.Length - 1, 1);
}
sb.Append("]");
return sb.ToString();
}
上士闻道,勤能行之。中士闻道,若存若亡。下士闻道,大笑之。---------共勉
前一阵子,朋友托我帮忙用vb.net写一个数独游戏,我当时的第一个想法---万能的互联网肯定有资源,肯定有人写---当然这是必须的---我站在巨人的肩膀上帮朋友完成代码---但是我突然觉得自己站在巨人这么高的肩膀上太高耸,想要找一下脚踏实地的感觉,所以我想自己写写,看看能不能写出来,结果就是------我压根没有思路。
对,毫不夸张,无从下手。
更深刻的一件事就是项目中用的的树状结构(easyui tree 实现),同样是根据数据库动态生成,我站在巨人的肩膀上,看着网上类似的datatable转json拼接,很简单很简单的只是用到了一个循环,一个递归,可是把代码真正应用于我们的系统,我整整用了一天的时间,整整一天只写了一个循环,一个递归。
写出来的那一刻要多美好有多美好,更重要的是我写完一个接下来一口气又写了三个,更更重要的是我发现自己循环和递归还有数学逻辑编程这方面是硬伤啊,然后接下来最最重要的一条:都是自己吓唬自己罢了,这才是硬伤。
天天骗自己循环递归,算法自己不会写,写不好所以每次遇到循环递归算法都想着绕开走,想着让别人写吧,我是真的不会啊种种,哎呀呀白接受米总的教育了。。到现在还这样自己骗自己。
真的没什么难的,所谓的难不过是自己告诉自己难,不过是自己给自己设立的围墙。
最后献上datatable转easyui treejson 的代码,大家不要见笑,就是这么简单。
ps:代码注释不是没有而是给去掉了,没有挑战简直没意思
public static string DatatableToJsonUserRoleTree(DataTable dt, string pid, string pvalue, string id, string name, int flag)
{
StringBuilder sb = new StringBuilder();
DataTable chdt = GetChildren(int.Parse(pvalue));
string filter = String.Format(" {0}='{1}'", pid, pvalue);
DataRow[] drs = dt.Select(filter);
if (drs.Length < 1 && chdt.Rows.Count < 1)
{
return "";
}
if (drs.Length >= 1 || chdt.Rows.Count >= 1)
{
sb.Append(",\"children\":[");
if (chdt.Rows.Count >= 1)
{
foreach (DataRow chdrs in chdt.Rows)
{
int groupid = int.Parse(chdrs["group_id"].ToString());
sb.Append("{");
sb.AppendFormat("\"id\":\"{0}\",", chdrs["group_id"].ToString());
sb.AppendFormat("\"text\":\"{0}\"", chdrs["group_name"].ToString());
DataTable userdt = GetUserByGroup(groupid);
if (userdt.Rows.Count >= 1)
{
sb.Append(",\"children\":[");
foreach (DataRow userdrs in userdt.Rows)
{
sb.Append("{");
sb.AppendFormat("\"user_id\":\"{0}\",", userdrs["user_id"].ToString());
sb.AppendFormat("\"text\":\"{0}\"", userdrs["user_name"].ToString());
sb.Append("},");
}
if (sb.ToString().EndsWith(","))
{
sb.Remove(sb.Length - 1, 1);
}
sb.Append("]");
}
sb.Append("},");
}
}
if (drs.Length >= 1)
{
foreach (DataRow dr in drs)
{
string spid = dr[id].ToString();
sb.Append("{");
sb.AppendFormat("\"id\":\"{0}\",", dr[id].ToString());
sb.AppendFormat("\"text\":\"{0}\"", dr[name].ToString());
sb.Append(DatatableToJsonUserRoleTree(dt, pid, spid, id, name, 0).TrimEnd(','));
sb.Append("},");
}
}
}
if (sb.ToString().EndsWith(","))
{
sb.Remove(sb.Length - 1, 1);
}
sb.Append("]");
return sb.ToString();
}
上士闻道,勤能行之。中士闻道,若存若亡。下士闻道,大笑之。---------共勉
相关文章推荐
- 命令行快速技巧:如何定位一个文件
- jQuery寻找n以内完全数的方法
- 推荐10个2014年最佳的jQuery视频插件
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#中的尾递归与Continuation详解
- 采用easyui tree编写简单角色权限代码的方法
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- 基于jquery中children()与find()的区别介绍
- 了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
- cmd tree命令 以树形格式罗列文件
- Javascript递归打印Document层次关系实例分析
- JQuery打造PHP的AJAX表单提交实例
- jquery easyui使用心得
- 初试jQuery EasyUI 使用介绍
- 浅谈jQuery构造函数分析
- 在VS2008中使用jQuery智能感应的方法
- 从Ajax到JQuery Ajax学习
- jQuery仿gmail实现fixed布局的方法