说重点:递归算法实现树形结构的展示
使用DataTable方式实现
我们分析DAL代码中的category类 的GetList函数
我再次贴出来 该代码的功能是 说的频道下面的所有分类 并按照指定的排序条件排序
因为从表中读取的数据并没有 “谁归属于”所以有一个递归的函数
/// <summary>
/// 取得所有类别列表
/// </summary>
/// <param name="parent_id">父ID</param>
/// <param name="channel_id">频道ID</param>
/// <returns></returns>
public DataTable GetList(int parent_id, int channel_id)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select id,channel_id,title,parent_id,class_list,class_layer,sort_id,link_url,img_url,content,seo_title,seo_keywords,seo_description from dt_category");
strSql.Append(" where channel_id=" + channel_id + " order by sort_id asc,id desc");
DataSet ds = DbHelperOleDb.Query(strSql.ToString());
DataTable oldData = ds.Tables[0] as DataTable;
if (oldData == null)
{
return null;
}
//复制结构
DataTable newData = oldData.Clone();
//调用迭代组合成DAGATABLE
GetChilds(oldData, newData, parent_id, channel_id);
return newData;
}
函数如下所示
基本一看就懂,就是所得子分类之后 重写迭代即可 我将这个代码修改成了List版本 看下面 因为List提供的查找的方法更加的强大
/// <summary>
/// 从内存中取得所有下级类别列表(自身迭代)
/// </summary>
private void GetChilds(DataTable oldData, DataTable newData, int parent_id, int channel_id)
{
DataRow[] dr = oldData.Select("parent_id=" + parent_id);
for (int i = 0; i < dr.Length; i++)
{
//添加一行数据
DataRow row = newData.NewRow();
row["id"] = int.Parse(dr[i]["id"].ToString());
row["channel_id"] = int.Parse(dr[i]["channel_id"].ToString());
row["title"] = dr[i]["title"].ToString();
row["parent_id"] = int.Parse(dr[i]["parent_id"].ToString());
row["class_list"] = dr[i]["class_list"].ToString();
row["class_layer"] = int.Parse(dr[i]["class_layer"].ToString());
row["sort_id"] = int.Parse(dr[i]["sort_id"].ToString());
row["link_url"] = dr[i]["link_url"].ToString();
row["img_url"] = dr[i]["img_url"].ToString();
row["content"] = dr[i]["content"].ToString();
row["seo_title"] = dr[i]["seo_title"].ToString();
row["seo_keywords"] = dr[i]["seo_keywords"].ToString();
row["seo_description"] = dr[i]["seo_description"].ToString();
newData.Rows.Add(row);
//调用自身迭代
this.GetChilds(oldData, newData, int.Parse(dr[i]["id"].ToString()), channel_id);
}
}
List版本的如下
//List版本的无限分类递归算法
/// <summary>
/// 取得所有类别列表
/// </summary>
/// <param name="parent_id">父ID</param>
/// <param name="channel_id">频道ID</param>
/// <returns></returns>
public List<DTcms.Model.category> GetListV2(int parent_id, int channel_id)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select id,channel_id,title,parent_id,class_list,class_layer,sort_id,link_url,img_url,content,seo_title,seo_keywords,seo_description from dt_category");
strSql.Append(" where channel_id=" + channel_id + " order by sort_id asc,id desc");
List<DTcms.Model.category> oldData = DataReaderToListV2(DbHelperOleDb.ExecuteReader(strSql.ToString()));
if (oldData.Count == 0)
{
return null;
}
List<DTcms.Model.category> newData = new List<DTcms.Model.category>(oldData.Capacity);
GetChildsV2(oldData, newData, parent_id, channel_id);
return newData;
}
private static List<DTcms.Model.category> DataReaderToListV2(OleDbDataReader read)
{
List<DTcms.Model.category> list = new List<DTcms.Model.category>();
while (read.Read())
{
DTcms.Model.category model = new DTcms.Model.category();
model.id = int.Parse(read["id"].ToString());
model.channel_id = int.Parse(read["channel_id"].ToString());
model.title = read["title"].ToString();
model.parent_id = int.Parse(read["parent_id"].ToString());
model.class_list = read["class_list"].ToString();
model.class_layer = int.Parse(read["class_layer"].ToString());
model.sort_id = int.Parse(read["sort_id"].ToString());
model.link_url = read["link_url"].ToString();
model.img_url = read["img_url"].ToString();
model.content = read["content"].ToString();
model.seo_title = read["seo_title"].ToString();
model.seo_keywords = read["seo_keywords"].ToString();
model.seo_description = read["seo_description"].ToString();
list.Add(model);
}
read.Close();
return list;
}
/// <summary>
/// 从内存中取得所有下级类别列表(自身迭代)
/// </summary>
private void GetChildsV2(List<DTcms.Model.category> oldData, List<DTcms.Model.category> newData, int parent_id, int channel_id)
{
oldData.FindAll(delegate(DTcms.Model.category info)
{
return (info.parent_id == parent_id);
}).ForEach(
delegate(DTcms.Model.category info2)
{
newData.Add(info2);
this.GetChildsV2(oldData, newData, info2.id, channel_id);
});
}
看看我就说嘛是不是很简答啊
直接FindAll出来就行了 好哈哈 简直就是一行代码就搞定了