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

来源:互联网 发布:调侃程序员的段子 编辑:程序博客网 时间:2024/05/17 06:21
应聘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();
            
        }

 

结束:

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

说不上那个好呵呵。

原创粉丝点击