分享下自己写的树状城市结构图~
先来个效果图..如果要查询中国有什么城市
如果要查询广东有什么城市
类似这样的东西,曹版主也写过一篇相关的文章 http://bbs.csdn.net/topics/390300855
那我为啥还要写呢?因为曹版主的一篇算法擂台..让我对这些树状结构产生了兴趣..
但对于我这些培训了半年就出来工作的人来说..很难去写出那样的东西..但因为喜爱..还是把头埋了下去弄..因为版主写的那个树状图..又linq..又IEnumerable..都是些没见过的东西..我打开后没2秒就关了(我想了解了那些再去看)..
废话扯多了..我们来看看这个菜鸟版的树状城市结构图咋弄的..
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Collections;
using System.Text.RegularExpressions;
namespace MyWeb
{
public partial class WebForm4 : System.Web.UI.Page
{
public class Node
{
public Node()
{
Next = new List<Node>();
}
private List<Node> _next;
internal List<Node> Next
{
get { return _next; }
set { _next = value; }
}
private int _id;
public int Id
{
get { return _id; }
set { _id = value; }
}
private int _pid;
public int Pid
{
get { return _pid; }
set { _pid = value; }
}
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
public class ReadNode
{
//关键就在于ReadNodeForId和Setplace
//ReadNodeForId会一直往下读,并且写入noderesult的节点中..
//而每次写入之前..要判断下当前是在哪个节点..
private static List<Node> noderesult = new List<Node>();
private static List<Node> nodetemp = noderesult;
private List<Node> node_list;
private int city_id;
public List<Node> ReadNodeForId(int id, List<Node> list)
{
noderesult.Clear();
nodetemp.Clear();
node_list = list;
city_id = id;
Read(city_id);
return noderesult;
}
public void Read(int id)
{
foreach (Node root in node_list)
{
if (root.Pid == id)
{
SetPlace(root.Pid, noderesult);
nodetemp.Add(root);
Read(root.Id);
}
}
}
public void SetPlace(int id, List<Node> temp)
{
if (city_id == id)
{
nodetemp = noderesult;
}
else
{
foreach (Node root in temp)
{
if (root.Id == id)
{
nodetemp = root.Next;
break;
}
else
{
SetPlace(id, root.Next);
}
}
}
}
}
Label label = new Label();
List<Node> listforui;
//初始化数据
public void init()
{
string city = @"id=10,pid=1,name=深圳市
id=1,pid=0,name=广东省
id=2,pid=1,name=广州市
id=3,pid=1,name=佛山市
id=9,pid=3,name=狮山区
id=4,pid=0,name=湖南省
id=5,pid=4,name=岳阳市
id=6,pid=4,name=长沙市
id=7,pid=2,name=越秀区
id=8,pid=7,name=矿泉街
id=9,pid=0,name=江苏省
id=10,pid=0,name=四川省
id=11,pid=2,name=荔湾区
id=12,pid=2,name=东山区
id=13,pid=4,name=常德市
id=14,pid=10,name=成都市
id=15,pid=9,name=南京市";
MatchCollection mc = Regex.Matches(Regex.Replace(city, "[\r\n ]", ""), @"id=(\d+),pid=(\d+),name=([^i]+)");
listforui = new List<Node>();
foreach (Match match in mc)
{
Node node_temp = new Node();
node_temp.Id = Convert.ToInt32(match.Groups[1].Value);
node_temp.Pid = Convert.ToInt32(match.Groups[2].Value);
node_temp.Name = match.Groups[3].Value;
listforui.Add(node_temp);
}
}
//用于显示
public void Bind(List<Node> list, int index)
{
Boolean boolean = false;
foreach (Node node in list)
{
if (boolean & index != 0)
{
string kongge = "";
for (int i = 0; i < index * 7; i++)
{
kongge += " ";
}
label.Text += "<br/> " + kongge + "-" + node.Name;
}
else if (index == 0)
{
label.Text += "<br/> -" + node.Name;
}
else
{
label.Text += "-" + node.Name;
boolean = true;
}
if (node.Next.Count != 0)
{
int temp = index + 1;
Bind(node.Next, temp);
}
}
}
protected void Page_Load(object sender, EventArgs e)
{
init();
int id = 0;//设置要查询的地方的id
listforui = new ReadNode().ReadNodeForId(id, listforui);
Bind(listforui, 0);
HtmlForm form = new HtmlForm();
form.ID = "form1";
Page.Controls.Add(form);
Page.FindControl("form1").Controls.Add(label);
}
}
}
--------------------编程问答-------------------- 因为测试时狮山区和江苏省的id都为9..所以结果没问题的 --------------------编程问答-------------------- 写得很辛苦 --------------------编程问答-------------------- 沙发竟然占了,可恶~~~ --------------------编程问答-------------------- 是呀,你放在一个数组里不就行了吗?那样苦的写呀! --------------------编程问答-------------------- 支持下,接分
补充:.NET技术 , C#