C#递归累计到父行

搞了半天 写了一个算法,希望能帮到需要的朋友

效果如下

水电费用是由 就是部门水费和电费累加的,而部门水费由科室水费累加起来的

表结构

DataTable dt = new DataTable();
dt.Columns.Add("pid");
dt.Columns.Add("fatherid");
dt.Columns.Add("Categories");
dt.Columns.Add("Month");

思路:
用递归算法:累计下级数量,递归累计到上级

 public DataTable SumNumber(DataTable dt, string fatherid)
        {
            //月累计
            double m_count = 0;

            //查询是否有下级
            DataRow[] rows = dt.Select("fatherid=‘" + fatherid + "‘");

            //上级变量,下级汇总数量到上级
            DataRow fatherow = null;
            if (dt.Select("pid=‘" + fatherid + "‘").Length > 0)
            {
                fatherow = dt.Select("pid=‘" + fatherid + "‘")[0];
            }

            //循环子行
            foreach (DataRow row in rows)
            {
                m_count = Convert.ToDouble(row["Month"]);
                //判断是否还有下下级
                DataRow[] childrows = dt.Select("fatherid=‘" + row["pid"] + "‘");
                foreach (DataRow item in childrows)
                {
                    SumNumber(dt, item["pid"].ToString());
                    m_count += Convert.ToDouble(item["Month"]);
                }
                //累计下下级到本级
                row["Month"] = m_count;
                //累计本级到上级
                if (fatherow != null)
                {
                    fatherow["Month"] = Convert.ToDouble(fatherow["Month"]) + m_count;
                }
            }

            return dt;
        }

调用
 dt = SumNumber(dt, "0");

时间: 2024-10-05 10:52:10

C#递归累计到父行的相关文章

递归解决根据父节点遍历权限树菜单的问题--------mysql数据中的树表

本人几乎没写过博客,感觉要学的知识和要做的事情太多,没时间.但发现用博客记录自己学习心得非常好,就抽时间写点,供自己以后参考也分享给某些需要的人,我水平有限,请多指教! 最近在独自尝试开发一个小型的oa系统以巩固下自己对java ssh框架的学习.这里记录下开发中的一些心得体会. 我把系统菜单设计成树,用一张表存储,各个菜单项之间是父子关系,当我们要根据用户权限去数据库中取菜单项时,发现sql语句不好解决.之前在网上查看了一些帖子博文,发现oracle中有对这个需求有专门的sql语句:类似这样

SQL 递归树 子父节点相互查询

if object_id('[tb]') is not null drop table [tb] go create table [tb]([modeid] int,modename varchar(20),parentid int) insert [tb] select 100 ,'商品管理', 0 union all select 101 ,'定单管理', 0 union all select 102 ,'用户管理', 0 union all select 104 ,'学院广告', 0 un

算法Sedgewick第四版-第1章基础-001递归

一. 方法可以调用自己(如果你对递归概念感到奇怪,请完成练习 1.1.16 到练习 1.1.22).例如,下面给出了 BinarySearch 的 rank() 方法的另一种实现.我们会经常使用递归,因为递归代码比相应的非递归代码更加简洁优雅.易懂.下面这种实现中的注释就言简意赅地说明了代码的作用.我们可以用数学归纳法证明这段注释所解释的算法的正确性.我们会在 3.1 节中展开这个话题并为二分查找提供一个这样的证明.编写递归代码时最重要的有以下三点.? 递归总有一个最简单的情况——方法的第一条语

关于递归与二分查找技术

简单的说,递归就是函数自己调用自己.在数据结构里面会经常使用递归,因为递归代码比较简洁优雅,易懂. 编写递归程序时主要注意三点 (1)递归总有一个最简单的情况,方法的第一条语句总是包含return的条件语句 (2)递归调用总是去尝试解决一个规模更小的子问题,这样递归才能收敛到最简单的情况.在下面代码中,第四个参数和第三个参数的差值一直在缩小 (3)递归调用的父问题和尝试解决的子问题之间不应该有交集.在如下代码中,两个子问题,各自操作的数组部分是不同的 下面是二分法查找的递归实现和非递归实现: 特

对象的串行化

一.串行化的概念和目的 1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(persistence).对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) .串行化的主要任务是写出对象实例变量的数值.如果交量是另一对象的引用,则引用的对象也要串行化.这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括

JavaEE 对象的串行化(Serialization)

什么情况下需要序列化 a)当你想把的内存中的对象写入到硬盘的时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候:再稍微解释一下:a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存.在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口:b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象

blob及行外数据

本文中我们假设innodb_page_size为16k,记录格式为compact. 1 大字段 大字段的类型可以参看这里, Data Type Storage Required TINYBLOB, TINYTEXT L + 1 bytes, where L < 28 BLOB, TEXT L + 2 bytes, where L < 216 MEDIUMBLOB, MEDIUMTEXT L + 3 bytes, where L < 224 LONGBLOB, LONGTEXT L + 4

java串行化

一.串行化的概念和目的 1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力,叫作对象的持续性(persistence).对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) .串行化的主要任务是写出对象实例变量的数值.如果变量是另一对象的引用,则引用的对象也要串行化.这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括

C语言强化(十一)二叉树镜像变化 | 要求:不使用递归

用了这么久的递归,现在不让用递归了,你行么? 通过这道题,你可以学会 如何镜像变化一棵二叉树 什么是递归的本质 如何巧妙地使用辅助栈 题目: 输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点. 要求: 不使用递归 例如输入: 输出: 将二叉树镜像变化的方法很简单,只要把所有节点的左右节点对调就行了,使用递归可以非常容易的实现. 如下为递归方法实现镜像变化的函数 /** 二叉树镜像变化--递归方法实现 */ void Revertsetree_R