数据表 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)。

解决方案 »

  1.   

    using System;
    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 . . .
      

  2.   

    Press any key to continue . . .
    你好象是用 sharpdevelpo
      

  3.   

    不用那些玩意。VS2010。难道你不知道 Ctrl + F5 会自动 Pause?