惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
Microsoft Azure Blog
Microsoft Azure Blog
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
Vercel News
Vercel News
H
Help Net Security
Martin Fowler
Martin Fowler
美团技术团队
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
MyScale Blog
MyScale Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
小众软件
小众软件
T
Tailwind CSS Blog
WordPress大学
WordPress大学

博客园 - 佚名

SqlCommand执行带GO的SQL脚本文件 TreeList之Extjs篇 XtreTreeList使用扎记(四) XtraTreeList使用扎记(2) TreeView节点快速访问之道 看了感触很深的一个贴子 XtraTreeList使用扎记(1) 勇气宣言 搞笑的段子 特别的一天 C#设计模式读书笔记之合成模式 C#设计模式读书笔记之适配器模式 C#设计模式读书笔记(1) Vs2003多窗口下的复杂数据传递 OWC中双刻度图表的实现 男人25岁前必须明白的21个道理!!! 关于Excel中Merge单元格 NET下XML的访问 ADO.NET技术内幕疑点之一
TreeList使用扎记(3)
佚名 · 2006-10-18 · via 博客园 - 佚名

今天遇到一个求树形结构中所有节点的值求合的问题,TreeList自身提供了类似的功能,可是它的表现形式并不是我想要的,我需要将子结点的合放在父节点的值中。折腾了几下。还弄不出来,我是不喜欢接受人家东西的人。除非是自己实现不了。那是能力问题,自己想了一下。有些头绪,干脆自己来写个过程实现算了。刚开始想着用递归。说来惭愧。学编程这么久。对这个东西还是模模糊糊的印象。搞了两下。竟然不行。上网一问大虾们。被骂个半死。偶是菜鸟中的菜鸟,连二叉树的问题都搞不定。说的我当时就想去跳楼。没有办法。能力有限啊。最后想到了将树形数据转化为线型数据来处理,这样子就发挥了搜索和排序的威力。最后用Hashtable实现。到于线型数据,我用到了TreeListOperation中的Execute过程来将所有的节点加到一个Hashtable中。转换过程代码如下:

 1using System;
 2using System.Collections ;
 3using DevExpress.XtraTreeList;
 4using DevExpress.XtraTreeList.Columns ;
 5using DevExpress.XtraTreeList.Nodes ;
 6using DevExpress.XtraTreeList.Nodes.Operations ;
 7namespace NskProject
 8{
 9    /// <summary>
10    ///求树形数据之和,辅助类,将数据取到Hashtable。
11    /// </summary>

12    public class GetSumItemList:TreeListOperation
13    {
14        Hashtable _ValueList=new Hashtable();
15        int _MaxLevel=0;
16        public override void Execute(TreeListNode node)
17        {
18            TreeSumData SumData=new TreeSumData();
19            SumData.Level =node.Level;
20            if(SumData.Level>_MaxLevel)
21            {
22                _MaxLevel=SumData.Level ;
23            }

24            SumData.ParentID =node.ParentNode!=null?node.ParentNode.Id+1:0;
25            SumData.ID =node.Id+1;
26            string text=node.GetDisplayText(ValueColumn);
27            double value=0;
28            if(Double.TryParse(text,System.Globalization.NumberStyles.Number,null,out value))
29            {
30                SumData.Value =value;
31            }

32            else
33            {
34                SumData.Value =0;
35            }

36            SumData.IsParent =node.HasChildren ?true:false;
37            ValueList.Add(node.Id+1 ,SumData);
38        }

39
40        TreeListColumn _ValueColumn=null;
41        public TreeListColumn ValueColumn
42        {
43            get{return _ValueColumn;}
44            set{_ValueColumn=value;}
45        }

46        public Hashtable ValueList
47        {
48            get{return _ValueList;}
49        }

50        public int MaxLevel
51        {
52            get{return _MaxLevel;}
53        }

54    }

55}

56

其中存入到Hashtable中的Struct是这样的:
//对树形数据求和用到数据结构
 public struct TreeSumData
 {
  public int Level;//深度
  public double Value;//值
  public int ParentID;//父节点ID
  public int ID;//自身ID
  public bool IsParent;//是否为父节点
 }
当得到一个线型的数据列表和该树形数据集合的最大深度后,我们就可以正式开始进行计算了。菜鸟我不会二叉树。也不会什么算法。就只好一层一层的算了。中间有大量的拆箱和装箱操作,在2005下采用List泛型实现效率应该会高一些。

  1using System;
  2using System.Collections ;
  3
  4namespace NskProject
  5{
  6    /// <summary>
  7    /// 自顶向上计算各个节点的值
  8    /// </summary>

  9    public class SumTreeDataInHashtable
 10    {
 11        Hashtable Value=new Hashtable();
 12        public SumTreeDataInHashtable(Hashtable value)
 13        {
 14            Value=value;
 15        }

 16
 17        public void SumAll()
 18        {
 19            for(int i=MaxLevel-1;i>=0;i--)
 20            {
 21                GetParentList(i);
 22            }

 23        }

 24
 25        //最大深度
 26        int _MaxLevel=0;
 27        public int MaxLevel
 28        {
 29            get{return _MaxLevel;}
 30            set{_MaxLevel=value;}
 31        }

 32        public Hashtable Result
 33        {
 34            get{return Value;}//结果输出
 35        }

 36        //单层的计算
 37        private void GetParentList(int Level)
 38        {
 39            ArrayList ID;
 40            ID=GetParentID(Level);
 41            for(int n=0;n<ID.Count;n++)
 42            {
 43                int CurrentParentID=Convert.ToInt32(ID[n]);
 44                ArrayList Current=new ArrayList();
 45                foreach(object value in Value.Values)
 46                {
 47                    TreeSumData Data=(TreeSumData)value;
 48                    if(Data.ParentID==CurrentParentID)
 49                    {
 50                        Current.Add(Data.Value);
 51                    }

 52                    else if(Data.ID==CurrentParentID)
 53                    {
 54                        Current.Add(Data.Value );
 55                    }

 56                }

 57                double SumValue=SumArrayList(Current);
 58                TreeSumData tmp=(TreeSumData)Value[CurrentParentID];
 59                tmp.Value =SumValue;
 60                Value[CurrentParentID]=tmp;
 61            }

 62        }

 63
 64
 65        /// <summary>
 66        /// 取得上层父节点有的数量
 67        /// </summary>
 68        /// <param name="Level"></param>
 69        /// <returns></returns>

 70        private ArrayList GetParentID(int Level)
 71        {
 72                            
 73            ArrayList Res=new ArrayList();
 74            foreach(object value in Value.Values)
 75            {
 76                TreeSumData Data=(TreeSumData)value;
 77                if(Data.Level ==Level)
 78                {
 79                    if(!Res.Contains(Data.ID))
 80                    {
 81                        Res.Add(Data.ID);
 82                    }

 83                }

 84            }

 85            return Res;
 86        }

 87
 88        //计算一个ArrayList中所有值的和
 89        private double SumArrayList(ArrayList Source)
 90        {
 91            double Res=0;
 92            for(int i=0;i<Source.Count;i++)
 93            {
 94                double t=Convert.ToDouble(Source[i]);
 95                Res+=t;
 96            }

 97            return Res;
 98        }

 99    }

100}

101