2017-12-06 1 views
-2

So berechnen Sie den Wert untergeordneter Elemente aus einer hierarchischen Liste in einer Schleife.So summieren Sie den Wert von untergeordneten Elementen aus einer hierarchischen Liste in einer Schleife

Ich brauche, dass während der Schleife in der Liste die Werte der Menge und Preis-Eigenschaft die Summe dieser Eigenschaften der Kinder enthalten.

Im Folgenden sind die zwei Klassen, die verwendet werden, um mir zu helfen, mein Problem zu lösen.

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

"Ich habe versucht, eine rekursive Methode zu verwenden, aber ich konnte es nicht tun" Bitte posten Sie, * was * Sie versucht haben. Im schlimmsten Fall schreibt hier jemand die exakt gleiche Lösung, weil wir nicht wissen, was Sie schon versucht haben. Aber ich bezweifle, dass dir das helfen würde, oder? – HimBromBeere

+1

Haben Sie etwas versucht? – Alejandro

+0

Ist das eine Frage von einem Test oder Fluch oder etwas ähnliches? – KinSlayerUY

Antwort

0

die Elemente in der Liste Unter der Annahme, sortiert werden, wie sie in Ihrem Beispiel sind der schnellste Weg, dies zu tun, sollten Sie durch die Liste in umgekehrter Reihenfolge und fügen Sie den Betrag auf den Listeneintrag mit dem richtigen iterieren sein Ich würde.

  1. Iterate rückwärts durch die Liste
  2. Wenn das aktuelle Element hat ein Elternteil hinzufügen Menge und Menge * Preis für es

EDIT:

Nachdem Sie Ihren Kommentar in Ihrer Quelle lesen Ich nehme an, du wusstest bereits, was ich gerade geschrieben habe.

Mein Ansatz folgendes wäre:

 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

zum Erstellen einer hierarchischen Struktur, modifizierte ich Ihre PlanilhaCusto eine Art eines Knoten im Baum zu ähneln, beide Eltern und Kinder Gliedern, für erleichtern die Traverse

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; } 
} 

diese Struktur wiedergegeben und ein Anfangseingangs

enter image description here

können Sie die gesamte Baumstruktur unabhängig davon, wie viele Ebenen gibt es unter Berufung auf einige Rekursion

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, 
       }; 

bauen, die die anfängliche Datenquelle in etwas ähnliches

enter image description here

und von hier projizieren würde Sie müssen nur die Hierarchie durchlaufen und den Gesamtpreis zusammenstellen

enter image description here

+0

siehe den zugehörigen Text für die gesamte Implementierung https://gist.github.com/dandohotaru/f87a4adf21b8e516cabf67ecfd4674e8 –

Verwandte Themen