数据表 dt 如下:id name 01 电脑
02 手机
03 电视机
0101 联想
0102 华硕
0103 惠普
0201 诺基亚
0202 三星
0301 夏普
0302 海尔
020101 N81
020102 N95
.....
现在要写一个循环,可以输出以上内容,格式:
{name:电脑[
{name:联想},
{name:华硕},
{name:惠普}
]},
{name:手机[
{name:诺基亚[
{name:N81},
{name:N95}
]},
{name:三星}
]},
{name:电视[
{name:夏普},
{name:海尔}
]}要有良好的拓展性,保证以后数据库添加的内容也能嵌套到循环里面。
(举例:数据库加ID(02010101)...N81里又包含多一层。。)
上不上代码自便,但不上代码的高手希望能把思路说清晰一点。菜鸟学东西不容易啊(T0T)。
02 手机
03 电视机
0101 联想
0102 华硕
0103 惠普
0201 诺基亚
0202 三星
0301 夏普
0302 海尔
020101 N81
020102 N95
.....
现在要写一个循环,可以输出以上内容,格式:
{name:电脑[
{name:联想},
{name:华硕},
{name:惠普}
]},
{name:手机[
{name:诺基亚[
{name:N81},
{name:N95}
]},
{name:三星}
]},
{name:电视[
{name:夏普},
{name:海尔}
]}要有良好的拓展性,保证以后数据库添加的内容也能嵌套到循环里面。
(举例:数据库加ID(02010101)...N81里又包含多一层。。)
上不上代码自便,但不上代码的高手希望能把思路说清晰一点。菜鸟学东西不容易啊(T0T)。
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;namespace ConsoleApplication1
{
class Program
{
class Data
{
public int Level { get; set; }
public string ID { get; set; }
public string Name { get; set; }
public List<Data> Childs { get; set; }
public Data() { Childs = new List<Data>(); } public Data this[string id]
{
get
{
if (ID == id) return this;
Data data = null;
if (Childs.Count > 0)
{
data = Childs.Where(x => x.ID == id).SingleOrDefault();
if (data == null)
{
foreach (var item in Childs)
{
data = item[id];
if (data != null) break;
}
}
}
return data;
}
}
public override string ToString()
{
string TableChar = "";
for (int i = 0; i < Level; i++) TableChar += "\t";
StringBuilder sb = new StringBuilder();
if (Childs.Count == 0)
{
sb.Append(string.Format("{0}{{name:{1}}}", TableChar, Name));
}
else
{
sb.AppendLine(string.Format("{0}{{name:{1}[", TableChar, Name));
for (int i = 0; i < Childs.Count; i++)
{
sb.AppendLine("\t" +
Childs[i].ToString() + ((i == Childs.Count - 1) ? "" : ","));
}
sb.Append(string.Format("\t{0}]}}", TableChar));
}
return sb.ToString();
}
} static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("name");
dt.Rows.Add("01", "电脑");
dt.Rows.Add("02", "手机");
dt.Rows.Add("03", "电视机");
dt.Rows.Add("0101", "联想");
dt.Rows.Add("0102", "华硕");
dt.Rows.Add("0103", "惠普");
dt.Rows.Add("0201", "诺基亚");
dt.Rows.Add("0202", "三星");
dt.Rows.Add("0301", "夏普");
dt.Rows.Add("0302", "海尔");
dt.Rows.Add("020101", "N81");
dt.Rows.Add("020102", "N95");
var list = (from x
in dt.Rows.Cast<DataRow>()
group x by x["id"].ToString().Length into g
select new { Key = g.Key, Items = g.ToList() }).OrderBy(x => x.Key);
List<Data> DataRoot = new List<Data>();
list.ToList()
.ForEach(x =>
{
if (x.Key == 2)
{
x.Items.ForEach(y => DataRoot.Add(new Data()
{
ID = y["id"].ToString(),
Name = y["Name"].ToString(),
Level = x.Key / 2 - 1
}));
}
else
{
x.Items.ForEach(y =>
{
Data data = null;
foreach (var item in DataRoot)
{
data = item[y["id"].ToString().Substring(0, y["id"].ToString().Length - 2)];
if (data != null) break;
}
if (data != null)
{
data.Childs.Add(new Data()
{
ID = y["id"].ToString(),
Name = y["Name"].ToString(),
Level = x.Key / 2 - 1
});
}
});
}
});
StringBuilder sb = new StringBuilder();
for (int i = 0; i < DataRoot.Count; i++)
{
sb.AppendLine(DataRoot[i].ToString());
}
string Result = sb.ToString();
Console.WriteLine(Result);
}
}
}{name:电脑[
{name:联想},
{name:华硕},
{name:惠普}
]}
{name:手机[
{name:诺基亚[
{name:N81},
{name:N95}
]},
{name:三星}
]}
{name:电视机[
{name:夏普},
{name:海尔}
]}Press any key to continue . . .
你好象是用 sharpdevelpo