当前位置:编程学习 > C#/ASP.NET >>

如何写以下这个嵌套循环

数据表 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)。 --------------------编程问答--------------------
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 . . . --------------------编程问答-------------------- Press any key to continue . . .
你好象是用 sharpdevelpo --------------------编程问答--------------------
引用 2 楼 bios8086 的回复:
Press any key to continue . . .
你好象是用 sharpdevelpo

不用那些玩意。

VS2010。难道你不知道 Ctrl + F5 会自动 Pause?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,