C# 无限级分类的实现

数据库表:CategoryInfo
字段名 类型
ciID int //记录序号,自增量
ciName nvarchar(20) //分类名
ciParent int //父分类序号
ciLayer int //所处的层次
ciDescription nvarchar(200) //对分类的描述
分类的类设计
public class CategoryInfo
{
private int ciID;//分类ID
private string ciName;//分类名
private int ciParent;//分类的父分类ID
private string ciDescription;//分类描述
private int ciLayer;//分类所属层次
//构造函数
public CategoryInfo() { }
public CategoryInfo(int cID, string cName, int cParent, string cDescription, int cLayer)
{
this.ciID = cID;
this.ciName = cName;
this.ciParent = cParent;
this.ciDescription = cDescription;
this.ciLayer = cLayer;
}
//属性
public int CategoryID
{
get{ return ciID;}
set { ciID = value;}
}
public string CategoryName
{
get{ return ciName;}
set { ciName = value; }
}
public int CategoryParent
{
get{ return ciParent;}
set { ciParent = value; }
}
public string CategoryDescription
{
get { return ciDescription; }
set { ciDescription = value; }
}
public int CategoryLayer
{
get { return ciLayer; }
set { ciLayer = value; }
}
}
获取子分类的存储过程
CREATE PROCEDURE [dbo].[category_getChild]
@cName nvarchar(20)
AS
BEGIN
DECLARE @tmpID int
SELECT @tmpID=ciID FROM CategoryInfo
WHERE RTRIM(ciName) = RTRIM(@cName)
if(@tmpID IS NOT NULL)
SELECT * FROM CategoryInfo
WHERE ciParent = @tmpID
ORDER BY ciLayer
END
获取子分类的函数
public IList<CategoryInfo> GetChildCategories(IList<CategoryInfo> cInfos,string cName)
{
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("category_getChild", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter(PARAM_CNAME, SqlDbType.NVarChar, 20));
cmd.Parameters[PARAM_CNAME].Value = cName;
IList<string> tmpNames = new List<string>(); //临时存储获取的子
try
{
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
CategoryInfo cInfo = new CategoryInfo(
(int)reader["ciID"],
reader["ciName"].ToString(),
(int)reader["ciParent"],
reader["ciDescription"].ToString(),
(int)reader["ciLayer"]
);
string tmpName = reader["ciName"].ToString();
cInfos.Add(cInfo);//添加获取到的分类到cInfos
tmpNames.Add(tmpName);//添加获取到的子分类名到tmpNames
}
}
}
catch
{
throw new ApplicationException("获取分类出错!");
}
finally
{
con.Close();
}
foreach(string c in tmpNames)
{
cInfos = GetChildCategories(cInfos,c); //递归运算。继续获取子分类
}
return cInfos;
}
说明:在该函数中,tmpNames如果换成是IList<CategoryInfo>,即它添加的元素与cInfos是一样的时,如果要移除其中的一项,则cInfos中会同时移除一项。因为CategoryInfo是类,是引用类型的,而非值类型。所以tmpNames采用了string类型,以避免这个问题。
对上面这个函数直接调用还稍嫌麻烦,上层程序还需要建立一个IList<CategoryInfo>对象,因此可以增加一个函数来调用上面的函数。这样,上层程序只需要提供分类名,以及是否包含本级分类两个参数就可以了。
//获取子分类,其中布尔参数表示是否包含本级分类
public IList<CategoryInfo> GetCategories( string cName, bool IsIncludeSelf)
{
IList<CategoryInfo> cInfos = new List<CategoryInfo>();
cInfos = GetChildCategories(cInfos, cName);
if (IsIncludeSelf == true)
{
cInfos.Insert(0, GetByName(cName));//根据名字获取分类,这个很简单,本文略。
}
return cInfos;
}
注意:采用这种方式时,WEB服务器获取子分类时要在数据库服务器之间有多次往返,降低了性能。采用存储过程实现递归逻辑,直接返回子分类列表的方式应该有更好的性能,尤其是Web服务器与数据库服务器不位于同一台服务器上时,更会受网络影响。

(0)

相关推荐

  • C#中@的用法总结

    本文实例汇总了C#中@的用法,对C#程序设计来说有不错的借鉴价值.具体如下: 一 字符串中的用法 1.学过C#的人都知道C# 中字符串常量可以以@ 开头声名,这样的优点是转义序列"不"被处理,按"原样"输出,即我们不需要对转义字符加上 \ (反斜扛),就可以轻松coding.如, string filePath = @"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.t

  • C#中方法的详细介绍

    1.让方法返回多个参数 1.1在方法体外定义变量保存结果 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Method {     class Program     {         public static int quotient;         public static int remainder;        

  • C#学习笔记整理_浅谈Math类的方法

    c#中Math类的方法 Math.Abs 已重载. 返回指定数字的绝对值. Math.Acos 返回余弦值为指定数字的角度. Math.Asin 返回正弦值为指定数字的角度. Math.Atan 返回正切值为指定数字的角度. Math.Atan2 返回正切值为两个指定数字的商的角度. Math.BigMul 生成两个 32 位数字的完整乘积. Math.Ceiling 已重载. 返回大于或等于指定数字的最小整数. Math.Cos 返回指定角度的余弦值. Math.Cosh 返回指定角度的双曲余

  • mysql 无限级分类实现思路

    第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类.这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fid(父id).这样可以根据WHERE id = fid来判断上一级内容,运用递归至最顶层. 分析:通过这种数据库设计出的无限级,可以说读取的时候相当费劲,所以大部分的程序最多3-4级分类,这就足以满足需求,从而一次性读出所有的数据,再对得到数组或者对象进行递归.本身负荷还是没太大问题.但是如果分类到更多级,那是不可取

  • 2款PHP无限级分类实例代码

    本文章总结了两款PHP无限级分类实现程序代码,有需要学习的朋友可参考一下. 主要思路:首先看第三行和第四行,父类ID(PARENTID)的值是1,表示属于id=1这个类的子类,而,一,二两行因为是一级分类,没有上级分类,所以父类ID(PARENTID)的值是0,表示初级分类,依次类推便实现了无限级分类.最终的效果是: ├一级分类A ├─┴二级分类A ├─┴二级分类B ├一级分类B 然后就是程序,这里以PHP作为描述语言,可以很方便的改成其他语言,因为原理相似,就是一个递归而已. <?php $d

  • Asp.net 无限级分类实例代码

    在网上找了很久也没有找到例子,没办法了,想偷懒也偷不成了,还是自己老老实实的写一个吧.不多废话,下面请看我做的详细方法. 1.无限级分类肯定要数据库支持啦,用户可以动态添加他们的分类嘛,下面是数据库的结构: 数据库主要有三个字段,这是最基本的了.第一个是主键,第二个是分类的名称了,第三个是父级目录id号. 2.成品的效果图:(大家最关心的是不是这个啊?看看是什么样子再看程序怎么吧) 看!!就长这个模样啦,这个层次关系就是上面那个数据所显示的结果.怎么样?还行吧... 3.最后就是提供程序咯,程序

  • PHP简单实现无限级分类的方法

    本文实例讲述了PHP简单实现无限级分类的方法.分享给大家供大家参考,具体如下: 数据库结构: CREATE TABLE IF NOT EXISTS `city` ( `id` int(11) NOT NULL auto_increment, `name` varchar(30) character set utf8 collate utf8_unicode_ci NOT NULL default '0', `parentId` int(11) NOT NULL default '0' PRIMA

  • PHP不使用递归的无限级分类简单实例

    不用递归实现无限级分类,简单测试了下性能比递归稍好一点点点,但写得太复杂了,还是递归简单方便点 代码: <?php $list = array( array('id'=>1, 'pid'=>0, 'deep'=>0, 'name'=>'test1'), array('id'=>2, 'pid'=>1, 'deep'=>1, 'name'=>'test2'), array('id'=>3, 'pid'=>0, 'deep'=>0, 'n

  • laravel 5.4中实现无限级分类的方法示例

    前言 本文主要给大家介绍的是关于laravel 5.4中实现无限级分类的相关内容,分享出来供有需要的朋友们参考学习,下面话不多说,来一起看看详细的介绍吧. 方法如下: 1.建立表 php artisan make:migration create_category_table --create=category 在database/migrations/下找到你的迁移文件 建入: <?php use Illuminate\Support\Facades\Schema; use Illuminat

  • 表格展示无限级分类(PHP版)

    TreeTable通过对单元格的行合并和列合并实现了无限层级也能较好的展示层级架构. 1.构建ID/PID/NAME的数组,后期可通过数据库生成的动态数据.Tree算法请点击 复制代码 代码如下: array( * 1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'), * 2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'), * 3 => array

  • php 无限级分类 获取顶级分类ID

    有这样一个表,id是分类的ID,name是分类名称,pid是上级分类的ID. 现在有个分类ID,程序要找到它上级的上级的上级--分类的ID,简单说就是找出顶级分类的ID. 比如"新鲜水果"的ID是13,对应父类ID是5,而5的父ID是1,1没有父类,也就是顶级分类了. 以前年轻气盛不懂事,总想着用递归来查找,然后再将结果缓存来解决性能问题. 后来又试过将整个表缓存起来,再递归查找. 再后来--似乎比较少有机会遇到无限级分类-- 最近有个同事问我怎么"优雅"的解决这个

  • php无限级分类实现方法分析

    本文实例讲述了php无限级分类实现方法.分享给大家供大家参考,具体如下: 1. 递归 public function getInfo(){ $data=$this->select(); $arr=$this->noLimit($data,$f_id=0,$level=0); return $arr; } //无限极分类 public function noLimit($data,$f_id=0,$level=0){ static $lists=array(); foreach($data as

  • CI框架无限级分类+递归的实现代码

    CI是什么? CodeIgniter是一个轻量级但功能强大的PHP框架,基于MVC设计模式,提供了一套丰富的类库,简单易学,高效实用. 下面看下CI框架无限级分类+递归的实现代码,具体代码如下所示: //无级分类+递归 public function digui(){ $crr = $this->db->get('category')->result_array(); $list['type'] = $this->nolimit($crr,0,0); $this->load-

随机推荐