【问题标题】:C# dynamic tree with many parameters, how to do it?C#动态树有很多参数,怎么办?
【发布时间】:2015-08-13 15:26:02
【问题描述】:

我试图用多个参数(点和类型)填充一棵树,最后显示哪个“分支”具有最大点数,并在每个分支中显示我有多少相等的元组。

树会是这样的:

父亲(点数:200|类型:2) |_CHILD01 (P:120|类型:3) | |_CHILD4 (P:300|T:3) | | |_CHILD8 (P:220|T:3) | | |_CHILD9 (P:65|T:1) | |_CHILD5 (P:15|T:9) |_CHILD2 (P:10|T:1) |_CHILD3 (P:80|T:2) |_CHILD6 (P:25|T:2) | |_CHILD10 (P:110|T:7) | |_CHILD11 (P:195|T:3) |_CHILD7 (P:50|T:7)

而我想要得到的是:

每个分支机构的点数: Branch01 -> 父亲 (200), CHILD01 (120), CHILD04 (300), CHILD08 (220) -> TotalPoints: 840 Branch02 -> 父亲 (200), CHILD01 (120), CHILD04 (300), CHILD09 (65) -> 总分:685 Branch03 -> 父亲 (200), CHILD01 (120), CHILD05 (15) -> TotalPoints: 335 Branch04 -> 父亲 (200), CHILD02 (10) -> 总分:210 Branch05 -> 父亲 (200), CHILD03 (80), CHILD06 (25), CHILD10 (110) -> 总分:415 Branch06 -> 父亲 (200), CHILD03 (80), CHILD06 (25), CHILD11 (195) -> 总分:500 Branch07 -> 父亲 (200), CHILD03 (80), CHILD07 (50) -> TotalPoints: 330

计算哪个分支中的类型数量: TypePerBranch01: - 类型1:0 - 类型2:1 - 类型3:2 - 类型4:1 - 类型5:0 - 类型6:0 - 类型7:0 - 类型8:0 - 类型9:0 TypePerBranch02: - 类型1:1 - 类型2:1 - 类型3:1 - 类型4:1 - 类型5:0 - 类型6:0 - 类型7:0 - 类型8:0 - 类型9:0 TypePerBranch03: - 类型1:0 - 类型2:1 - 类型3:1 - 类型4:0 - 类型5:0 - 类型6:0 - 类型7:0 - 类型8:0 - 类型9:1 TypePerBranch04: - 类型1:1 - 类型2:1 - 类型3:0 - 类型4:0 - 类型5:0 - 类型6:0 - 类型7:0 - 类型8:0 - 类型9:0 TypePerBranch05: - 类型1:0 - 类型2:3 - 类型3:0 - 类型4:0 - 类型5:0 - 类型6:0 - 类型7:1 - 类型8:0 - 类型9:0 TypePerBranch06: - 类型1:0 - 类型2:3 - 类型3:1 - 类型4:0 - 类型5:0 - 类型6:0 - 类型7:0 - 类型8:0 - 类型9:0 TypePerBranch07: - 类型1:0 - 类型2:2 - 类型3:0 - 类型4:0 - 类型5:0 - 类型6:0 - 类型7:1 - 类型8:0 - 类型9:0

我已经完成了一些代码,但它不起作用。 函数如下:

    //
    // FUNÇÃO ResizeArray
    public T[,] ResizeArray<T>(T[,] original, int xSize, int ySize)
    {
        var newArray = new T[xSize, ySize];
        var xMin = Math.Min(xSize, original.GetLength(0));
        var yMin = Math.Min(ySize, original.GetLength(1));
        for (var x = 0; x < xMin; x++)
            for (var y = 0; y < yMin; y++)
                newArray[x, y] = original[x, y];
        return newArray;
    }


    //
    // FUNÇÃO TreeBranchPath
    int[] TotalPontosRamo = new int[1];
    int[,] FolhaInfoPontos = new int[1, 1];
    int[,] FolhaInfoPatamar = new int[1, 1];
    int CountRamos = 0;

    private void TreeBranchPath(int idusr, int usrpnts, int usrpata, int nivelnum, int ramonum)
    {
        FolhaInfoPontos[nivelnum, ramonum] = usrpnts;
        FolhaInfoPatamar[nivelnum, ramonum] = usrpata;

        var AfilhadosList = (from af in db.NRV_USERS
                             where af.idpatrocinador == idusr
                             select af).ToList();


        /*Se for NULL não tem descendentes */
        if (AfilhadosList != null)
        {
            int CountNumFilhos = AfilhadosList.Count();
            int CountFilhos = 0;
            nivelnum = nivelnum + 1;

            FolhaInfoPontos = ResizeArray(FolhaInfoPontos, nivelnum, ramonum + CountNumFilhos);
            FolhaInfoPatamar = ResizeArray(FolhaInfoPatamar, nivelnum, ramonum + CountNumFilhos);

            foreach (var descid in AfilhadosList)
            {
                CountFilhos = CountFilhos + 1;

                /* Inicio - Quantos Pontos o User tem */
                var UserPoints = (from pnt in db.NRV_USERPONTOS
                                  where pnt.iduser == descid.id_user && pnt.usrpntact == true
                                  select pnt).FirstOrDefault();

                int TotalUserPoints = UserPoints.pontosgrupo + UserPoints.pontosproprios;
                /* Fim - Quantos Pontos o User tem */

                TotalPontosRamo[CountRamos] = TotalPontosRamo[CountRamos] + TotalUserPoints;


                /* Inicio - Em que Patamar o User está */
                var AuxUserPatamar = (from cp in db.NRV_USERPATAMAR
                                      where cp.iduser == idusr
                                      select cp.idpatamax).FirstOrDefault();
                /* Fim - Em que Patamar o User está */


                Array.Resize(ref TotalPontosRamo, CountRamos + 1);

                TreeBranchPath(descid.id_user, TotalUserPoints, AuxUserPatamar, nivelnum, CountFilhos);

            }
        }
        else
        {
            return;
        }
    }

有人可以帮助我吗?

【问题讨论】:

  • 我认为您无法得到答案,因为您的问题不清楚。例如,如果原始结构中不存在 -Type4 是什么?
  • 对不起,我忘记了:
     父亲 (Points:200|Type:2) |_CHILD01 (P:120|Type:3) | |_CHILD4 (P:300|T:3) | | |_CHILD8 (P:220|T:3) | | |_CHILD9 (P:65|T:1) | |_CHILD5 (P:15|T:9) |_CHILD2 (P:10|T:1) |_CHILD3 (P:80|T:2) |_CHILD6 (P:25|T:2) | |_CHILD10 (P:110|T:7) | |_CHILD11 (P:195|T:3) |_CHILD7 (P:50|T:7) 
  • @RicardoSousa -- 我有两个建议。首先,我认为您应该更具体(非常具体)关于当前代码“不起作用”的内容。其次,我认为您应该在上面的评论中获取信息(使用`
     标签和树数据)并将其包含在您的问题中——在评论中阅读太难了。

标签: c# recursion multidimensional-array


【解决方案1】:

这里我根据节点的层级对结果进行了缩进。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Node father = new Node()
            {
                name = "FATHER", points = 200, type = 2, children = new List<Node>(){
                    new Node() { 
                        name = "CHILD01", points = 120, type = 3, children = new List<Node>(){
                            new Node(){ 
                                name = "CHILD04", points = 300, type = 3, children = new List<Node>(){
                                       new Node(){ name = "CHILD08", points = 220, type = 3, children = null},
                                       new Node(){ name = "CHILD09", points = 65, type = 1, children = null}
                                }
                            },
                            new Node(){ name = "CHILD05", points = 15, type = 9, children = null}
                        }
                    },
                    new Node() { name = "CHILD02", points = 10, type = 1, children = null},
                    new Node(){ 
                        name = "CHILD03", points = 80, type = 2, children = new List<Node>(){
                            new Node(){
                                name = "CHILD06", points = 25, type = 2, children = new List<Node>(){
                                    new Node(){ name = "CHILD10", points = 110, type = 7, children = null},
                                    new Node(){ name = "CHILD11", points = 195, type = 3, children = null}
                                }
                            },
                            new Node(){ name = "CHILD07", points = 50, type = 7, children = null}
                        }
                    }
                }
            };
            Count results = father.GetTotals(0);

            foreach (Count result in Node.results)
            {
                Console.WriteLine("{0} Name = {1}, Points = {2}, Types = {3}",
                    string.Join("", Enumerable.Repeat("    ", result.level)),
                    result.name,
                    result.points,
                    string.Join(",", result.types.OrderBy(x => x.Key).Select(x => x.Key.ToString() + ":" + x.Value.ToString()).ToArray())
                    );
            }

        }
    }

    public class Count
    {
        public string name;
        public int level { get; set; }
        public int points { get; set; }
        public Dictionary<int, int> types { get; set; }
    }
    public class Node
    {
        public string name { get; set; }
        public int points { get; set; }
        public int type { get; set; }
        public List<Node> children { get; set; }
        public static List<Count> results = new List<Count>();

        public Count GetTotals(int level)
        {
            Count result = new Count();
            result.name = name;
            result.level = level;
            result.points = points;
            result.types = new Dictionary<int, int>();
            result.types.Add(type, 1);

            if (children != null)
            {

                for (int childCount = children.Count - 1; childCount >= 0; childCount--)
                {
                    Node child = children[childCount];
                    Count childResutls = child.GetTotals(level + 1);
                    result.points += childResutls.points;
                    foreach (int key in childResutls.types.Keys)
                    {
                        if (result.types.ContainsKey(key))
                        {
                            result.types[key] += childResutls.types[key];
                        }
                        else
                        {
                            result.types.Add(key, childResutls.types[key]);
                        }
                    }
                }
            }
            Node.results.Insert(0, result);
            return result;
        }
    }
}


​

【讨论】:

    【解决方案2】:

    这是一个略有不同的答案,节点与输入的顺序相同

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Node father = new Node()
                {
                    name = "FATHER", points = 200, type = 2, children = new List<Node>(){
                        new Node() { 
                            name = "CHILD01", points = 120, type = 3, children = new List<Node>(){
                                new Node(){ 
                                    name = "CHILD04", points = 300, type = 3, children = new List<Node>(){
                                           new Node(){ name = "CHILD08", points = 220, type = 3, children = null},
                                           new Node(){ name = "CHILD09", points = 65, type = 1, children = null}
                                    }
                                },
                                new Node(){ name = "CHILD05", points = 15, type = 9, children = null}
                            }
                        },
                        new Node() { name = "CHILD02", points = 10, type = 1, children = null},
                        new Node(){ 
                            name = "CHILD03", points = 80, type = 2, children = new List<Node>(){
                                new Node(){
                                    name = "CHILD06", points = 25, type = 2, children = new List<Node>(){
                                        new Node(){ name = "CHILD10", points = 110, type = 7, children = null},
                                        new Node(){ name = "CHILD11", points = 195, type = 3, children = null}
                                    }
                                },
                                new Node(){ name = "CHILD07", points = 50, type = 7, children = null}
                            }
                        }
                    }
                };
                Count results = father.GetTotals();
    
                foreach (Count result in Node.results)
                {
                    Console.WriteLine("Name = {0}, Points = {1}, Types = {2}",
                        result.name,
                        result.points,
                        string.Join(",", result.types.OrderBy(x => x.Key).Select(x => x.Key.ToString() + ":" + x.Value.ToString()).ToArray())
                        );
                }
    
            }
        }
    
        public class Count
        {
            public string name;
            public int points { get; set; }
            public Dictionary<int, int> types { get; set; }
        }
        public class Node
        {
            public string name { get; set; }
            public int points { get; set; }
            public int type { get; set; }
            public List<Node> children { get; set; }
            public static List<Count> results = new List<Count>();
    
            public Count GetTotals()
            {
                Count result = new Count();
                result.name = name;
                result.points = points;
                result.types = new Dictionary<int, int>();
                result.types.Add(type, 1);
    
                if (children != null)
                {
    
                    for (int childCount = children.Count - 1; childCount >= 0; childCount--)
                    {
                        Node child = children[childCount];
                        Count childResutls = child.GetTotals();
                        result.points += childResutls.points;
                        foreach (int key in childResutls.types.Keys)
                        {
                            if (result.types.ContainsKey(key))
                            {
                                result.types[key] += childResutls.types[key];
                            }
                            else
                            {
                                result.types.Add(key, childResutls.types[key]);
                            }
                        }
                    }
                }
                Node.results.Insert(0, result);
                return result;
            }
        }
    }
    
    
    ​
    

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 2021-11-05
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      相关资源
      最近更新 更多