应聘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,'数据库设计'
要求:根据下面提供的树状表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();
}
{
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 == 0) return 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();
}
{
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 == 0) return 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();
}
结束:
一个数据库打开时间长点,一个占用内存多点
说不上那个好呵呵。
- 应聘asp.net程序员笔试题——递归读取树状表生成json字符串(转)
- 应聘asp.net程序员笔试题——递归读取树状表生成json字符串(转)
- C++ 程序员应聘常见笔试题(1)
- C++ 程序员应聘常见笔试题(2)
- asp.net mvc c# 读取json文件返回字符串
- 程序员应聘当中常见的C语言笔试题01
- 程序员应聘当中常见的C语言笔试题02
- 程序员应聘当中常见的C语言笔试题03
- 程序员应聘当中常见的C语言笔试题04
- Asp.Net 使用“递归算法”生成目录树的JSON格式(值得收藏)
- 第一次应聘笔试经验总结——CVTE
- 递归读取树状配置文件
- Asp.net笔试题
- Asp.net笔试题
- ASP.NET笔试题
- asp.net笔试题
- asp.net笔试题
- 面试ASP.NET程序员的笔试题和机试题
- 跨服务器进行数据查询中出现的问题
- 解决FAT32格式下,不能复制大文件的问题
- 家长如何使自己的孩子轻松快乐地学好数学和英语?
- 给海归技术创业兄弟的九个忠告
- 链接一网友的的BLOG
- 应聘asp.net程序员笔试题——递归读取树状表生成json字符串(转)
- js中两个时间值的比较方法
- 手机上网的合理资费?
- The first day of working--everything is fresh to me--I am a super person!
- stopImmediatePropagation停止当前节点和后续节点的事件侦听
- 标准和统一 专家谈存储管理
- 面向对象学习(一)——基础术语篇
- IE7/IE8改为IE6
- 编译技术研究的未来以及相关的ACM Symposium