2017-12-06 13 views
-2

ループ内の階層リストから子アイテムの値を合計する方法。ループ内の階層リストから子アイテムの値を合計する方法

リストのループ中に、amountプロパティとpriceプロパティの値には、これらの子プロパティの合計が含まれている必要があります。

私の問題解決に役立つ2つのクラスは次のとおりです。リスト内の要素を想定し

namespace SGP.Dto.Custo 
{  
    public class PlanilhaCusto 
    { 
     public int id{ get; set; } 
     public int parenteId{ get; set; }  
     public string name { get; set; } 
     public decimal amount{ get; set; } 
     public decimal price{ get; set; } 

     public PlanilhaCusto(int pId, int pParenteId, pName, decimal pAmount, decimal pPrice) 
     { 
      id = pId; 
      parentId = pParentId; 
      name = pName; 
      amount = pAmount; 
      price = pPrice; 
     }   
    }  
} 

namespace SGP.Dto.Custo 
{ 
    public class ShowList 
    { 
     List<Dto.Custo.PlanilhaCusto> myList = new List<PlanilhaCusto>(); 

     public void Show() 
     {  
      myList.Add(new PlanilhaCusto(1, null, "Projetos", 0, 0)); 
      myList.Add(new PlanilhaCusto(2, 1, "Arquitetura", 5,10)); 
      myList.Add(new PlanilhaCusto(3, 1, "Estrutura", 0, 0)); 
      myList.Add(new PlanilhaCusto(4, 3, "Civil", 1, 50)); 
      myList.Add(new PlanilhaCusto(5, 3, "Infra", 3, 75)); 
      myList.Add(new PlanilhaCusto(6, null, "Pessoal", 0, 0)); 
      myList.Add(new PlanilhaCusto(7, 6, "Mão de Obra", 20, 5700)); 

      /*In this loop the value of the parent items must be updated 
       (calculated). The hierarchy of the list can be unlimited, 
       like a tree. I tried using a recursive method but I could 
       not do it.*/ 
      foreach (var itemList in myList) 
      { 

      } 
     } 
    } 
} 
+3

「再帰的な方法で試してみましたが、できませんでした」投稿してください。最悪の場合、ここで誰かがまったく同じ解決策を書いています。なぜなら、あなたが何をしようとしているのかが分かっていないからです。しかし、私はこれがあなたを助けるだろうと思っています、それはありませんか? – HimBromBeere

+1

何か試しましたか? – Alejandro

+0

これはテストや呪いなどの質問ですか? – KinSlayerUY

答えて

0

が、彼らはあなたの例である方法を並べ替えられて、これを行うための最速の方法は、逆の順序でリストを反復し、正しいとリスト項目に金額を追加しなければなりませんid。リスト

  • て後方

    1. 反復現在の要素が親量や金額を追加している*価格それに

    EDIT:

    ソースにあなたのコメントを読んだ後、私はあなたがすでに何を書きましたか知っていたと思います。

    私のアプローチは、以下のようになります。

     for (int i = myList.Count - 1; i > 1; i--) 
         { 
          var temp = myList.ElementAt(i); 
          if (temp.parentId != null) 
          { 
           var parent = myList.ElementAt(temp.parentId - 1); 
           parent.amount += temp.amount; 
           parent.price += (temp.amount * temp.price); 
          } 
         } 
    
  • 0

    階層構造を作成するために、私は親と子の両方のメンバーを持つ、ツリー内のノードのソートに似ている、あなたのPlanilhaCustoを変更し、ためのトラバースを容易に

    このような構造と初期入力が与えられ
    public class PlanilhaCusto 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
        public int? ParentId { get; set; } 
        public decimal Amount { get; set; } 
        public decimal Price { get; set; } 
        public IEnumerable<PlanilhaCusto> Children { get; set; } 
    } 
    

    enter image description here

    あなたは関係なく、いくつかの再帰に

    同様の

    enter image description here

    、ここから何かに初期データソースを投影します

    public IEnumerable<PlanilhaCusto> Descendants(PlanilhaCusto parent, IEnumerable<PlanilhaCusto> source) 
    { 
        var query = from node in source 
           where node.ParentId == parent.Id 
           let children = Descendants(node, source) 
           select new PlanilhaCusto 
           { 
            Id = node.Id, 
            ParentId = node.ParentId, 
            Name = node.Name, 
            Amount = node.Amount, 
            Price = node.Price, 
            Children = children, 
           }; 
    
        return query.ToList(); 
    } 
    
    var hierarchy = from node in source 
           let children = Descendants(node, source) 
           where node.ParentId == null 
           select new PlanilhaCusto 
           { 
            Id = node.Id, 
            ParentId = node.ParentId, 
            Name = node.Name, 
            Price = node.Price, 
            Children = children, 
           }; 
    

    が依存しているどのように多くのレベルのツリー構造全体を構築することができます

    階層をたどって総価格を構成するだけでいいです。

    public decimal? Total(PlanilhaCusto node) 
    { 
        decimal? price = node.Price * node.Amount; 
        if (node.Children != null) 
        { 
         foreach (var child in node.Children) 
         { 
          price += Total(child); 
         } 
        } 
    
        return price; 
    } 
    
    var totals = from node in hierarchy 
          select new 
          { 
           Id = node.Id, 
           Name = node.Name, 
           Total = Total(node), 
          }; 
    

    enter image description here

    +0

    実装全体の関連する要点を参照してください。https://gist.github.com/dandohotaru/f87a4adf21b8e516cabf67ecfd4674e8 –

    関連する問題