应聘asp.net程序员笔试题——递归读取树状表生成json字符串(转)

      这种树状表挺普遍的,和大家探讨下,挺喜欢递归方式读取这表,以前写过个递归读取用户控件生成管理这种表数据的table。 

应聘:

读书三年,毕业了,实习半年的旅游公司也已辞职,打算找正儿八经的搞程序的公司。网上投吧,暂不打算离开桂林

那范围就小了,看来看去就投了两家,桂林这行真的不砸的...

面试还算顺利,最后还要做道笔试题,笔就笔吧

题目:

/*
要求:根据下面提供的树状表Tasks,
         使用C#,写一个函数,读取数据库表Tasks,
         根据表的内容输出string类型的结果,
         结果的内容如下:
[
  {
    TaskID:'1',ParentID:'0',TaskName:'软件开发',
    children:[
               {
                 TaskID:'2',ParentID:'1',TaskName:'需求分析',
                 children:[
                            {TaskID:'3',ParentID:'2',TaskName:'客户需求调研'},
                            {TaskID:'4',ParentID:'2',TaskName:'生成需求文档'}
                           ]
                },
                {
                  TaskID:'5',ParentID:'1',TaskName:'系统分析',
                  children:[ 
                             {TaskID:'6',ParentID:'5',TaskName:'数据库设计'}
                            ]
                 }
              ]
  }
]
---------------------------------------------------
Tasks(任务表)表结构SQL脚本
---------------------------------------------------
TaskID ParentID TaskName //任务ID,父任务ID,任务名称
---------------------------------------------------
1      0        软件开发
2      1          需求分析
3      2            客户需求调研
4      2            生成需求文档
5      1          系统分析
6      5            数据库设计
---------------------------------------------------
*/


CREATE TABLE Tasks (
    TaskId 
int  ,             // 任务ID
    ParentID  int ,            // 父任务ID
    TaskName varchar ( 50 )    // 任务名称 

GO
Insert Into Tasks (TaskID,ParentID,TaskName)
select 
1 , 0 , ' 软件开发 '

Insert Into Tasks (TaskID,ParentID,TaskName)
select 
2 , 1 , ' 需求分析 '

Insert Into Tasks (TaskID,ParentID,TaskName)
select 
3 , 2 , ' 客户需求调研 '

Insert Into Tasks (TaskID,ParentID,TaskName)
select 
4 , 2 , ' 生成需求文档 '

Insert Into Tasks (TaskID,ParentID,TaskName)
select 
5 , 1 , ' 系统分析 '

Insert Into Tasks (TaskID,ParentID,TaskName)
select 
6 , 5 , ' 数据库设计 '

 

思考:

粗略看了下,还行挺普遍的数据表估计是要生成用在ext上的json数据,呵呵还对得起我这应届生,有两思路

一个用DataReader这玩意,一个用datatable。算了这是笔试要讲速度的就先用datareader写吧

 

解题:

1.花了20分钟搞出来了,慢了点,其实我对datatable更熟悉的怎么选了reader

 

         public   static   string  GetTasksString( int  TaskId)
        
{
            
using (OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["Link"].ConnectionString))
            
{
                conn.Open();
                
return "[" + GetTasksString(TaskId, conn) + "]";
            }
 
        }


        
private   static   string  GetTasksString( int  TaskId, OleDbConnection conn)
        
{
            OleDbCommand comm 
= new OleDbCommand("select * from [Tasks] where ParentID=" + TaskId, conn);
            OleDbDataReader red 
= comm.ExecuteReader();
            
if (!red.Read()) return string.Empty;

            StringBuilder str 
= new StringBuilder();
            
do
            
{
                str.Append(
"{");
                
for (int i = 0; i < red.FieldCount; i++)
                
{
                    
if (i != 0) str.Append(",");
                    str.Append(red.GetName(i));
                    str.Append(
":'");
                    str.Append(red.GetString(i));
                    str.Append(
"'");
                }

                str.Append(
",children:[");
                str.Append(GetTasksString(red.GetInt32(
0), conn));
                str.Append(
"]},");

            }
 while (red.Read());

            
return str[str.Length] == ',' ? str.ToString(0, str.Length - 1) : str.ToString();
        }

 

 2.为什么我总是喜欢用datatable

 

         public   static   string  GetTasks( int  TaskId)
        

            
using (OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["Link"].ConnectionString))
            
{
                conn.Open();
                OleDbCommand comm 
= new OleDbCommand("select * from [Tasks]", conn);
                OleDbDataAdapter ada 
= new OleDbDataAdapter();
                DataTable table 
= new DataTable();
                ada.Fill(table);
            }

            
return "["+GetTasksString(TaskId,table)+"]";
        }


        
private   static   string  GetTasksString( int  TaskId,DataTable table)
        
{
                DataRow[] rows 
= table.Select("ParentID="+TaskId.ToString());

                
if (rows.Length == 0return string.Empty; ;
                StringBuilder str 
= new StringBuilder();
                
                
foreach(DataRow row in rows)
                
{
                    str.Append(
"{");
                    
for (int i = 0; i < row.Table.Columns.Count; i++)
                    
{
                        
if(i!=0)str.Append(",");
                        str.Append(row.Table.Columns[i].ColumnName);
                        str.Append(
":'");
                        str.Append(row[i].ToString());
                        str.Append(
"'"); 
                    }

                    str.Append(
",children:[");
                    str.Append(GetTasksString((
int)row["TaskID"],table));
                    str.Append(
"]},");
                }

                
return str[str.Length] == ',' ? str.ToString(0, str.Length - 1) : str.ToString();
            
        }

 

结束:

一个数据库打开时间长点,一个占用内存多点

说不上那个好呵呵。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值