2017-12-04 3 views
-1

私のリストは、このように構成されていますリスト内の親エンティティの子オブジェクトの合計を計算

public class Custo{ 
     public int id { get; set; } 
     public int idParent { get; set; } 
     public decimal amount{ get; set; } 
     public decimal unitaryValue{ get; set; } 

} 

List<Custo> myLIst = new List<Custo>(); 

私は私のリストは次のように返したい:

における基本的
Name    Total Amount  Total Value 

Projetos   17,00   $70 

    Arquitetura  15,00   $60 

    Estrutura  10,00   $35 
    Modulo   5,00   $25 

    Desenho   2,00   $10 
    Artistico  2,00   $10 

Projetos Eletricos 0,00   $0 
+1

ルックアップ複合デザインパターン。 http://www.dotnettricks.com/learn/designpatterns/composite-design-pattern-dotnet –

+0

プロジェクト名(IDではない)を取得できるように、クラスを親クラスと結合する必要があります。リストが必要です(Custoクラスだけでなく) – jdweng

+0

'Custo'は' Projetos'とどのように関連していますか?各プロジェクトに多くの 'Custos'があるかもしれませんか? – Alisson

答えて

0

3つのクラスが必要です。 1つはタイノートとなり、他の2つはそれを継承します。 1つは子供を収容できるプロジェクトです。もう1つは子供/葉ノードであり、個々のCustosになります。

クラスを使用するときは、新しいProjectosを作成し、子ノードを追加し、表示するときにDisplayメソッドを呼び出します。あなたは明らかに他の機能のロジックを追加することができます。これは、コードに似てここで見つける:http://www.dofactory.com/net/composite-design-pattern

使い方があるかもしれない メイン

Projectos project = new Projectos("Projetos"); 
project.Add(new Custos("Arquitetura", 15, 70.00); 

Projectos electricos = new Projectos("Electricos"); 
electricos.Add(new Custos("custo1", 20, 80.00); 
project.Add(electricos); 

project.Display(); 

Projectos

using System; 
using System.Collections.Generic; 

namespace CompositePatternExercise 
{ 
    class Projectos : CustosNode 
    { 
     private List<CustosNode> elements = new List<CustosNode>(); 

     // Constructor 
     public Projectos(string name) : base(name) 
     { 
     } 

     public override void Add(CustosNode d) 
     { 
      elements.Add(d); 
     } 

     public override void Remove(CustosNode d) 
     { 
      elements.Remove(d); 
     } 
     public override void Display() 
     { 
      decimal totalValue = 0; 
      decimal totalAmount = 0; 

      Console.WriteLine(_name); 

      // Display each child element on this node 
      foreach (CustosNode d in elements) 
      { 
       d.Display(); 
       totalAmount += d.Amount; 
       totalValue += d.Value; 
      } 

      Console.Write("Project total:" + totalAmount.ToString("C") + " " + totalAmount.ToString("C")); 

     } 
    } 
} 

Custos

namespace CompositePatternExercise 
{ 
    class Custos : CustosNode 
    { 
      // Constructor 
      public Custos(string name, decimal amount, decimal value) : base(name, amount, value) 
      { 
      } 
      public override void Add(CustosNode c) 
      { 
       Console.WriteLine(
        "Cannot add to a custo"); 
      } 
      public override void Remove(CustosNode c) 
      { 
       Console.WriteLine(
        "Cannot remove from a custo"); 
      } 
      public override void Display() 
      { 
       Console.WriteLine(_name + " " + Amount.ToString("C") + " " + Value.ToString("C")); 
      } 
     } 
    } 
} 

CustosNode

namespace CompositePatternExercise 
{ 
    abstract class CustosNode 
    { 
     protected string _name; 
     protected decimal _amount = 0m; 
     protected decimal _value = 0m; 

     public decimal Value { get => _value; } 
     public decimal Amount { get => _amount; } 

     // Constructor 
     public CustosNode(string name) 
     { 
      this._name = name; 
     } 
     public CustosNode(string name, decimal amount, decimal value) 
     { 
      this._name = name; 
      this._amount = amount; 
      this._value = value; 
     } 
     public abstract void Add(CustosNode c); 
     public abstract void Remove(CustosNode c); 
     public abstract void Display(); 
    } 
} 
関連する問題