2017-10-18 10 views
1

私はこのコードを持っている:出力を印刷し、私はコストの合計を計算するために、再びそれを繰り返す必要はありません:異なる方法

public void printCost(List<c_flightRotationAircraft> fRAList, 
    List<c_itineraryDistFra> iDFraList, HashSet<string> distinctAircraft, HashSet<int> distinctItinerary, 
    List<c_position> positionList, List<c_airportAircraft> aAList, c_config config) 
{ 
    c_files f = new c_files(); 
    double pDC = passengerDelayCost(fRAList, iDFraList, distinctItinerary, config); // Passenger delay cost 
    double oCC = outboundCancelCost(fRAList, iDFraList, distinctItinerary, config); // Outbound cancellation cost 
    double iCC = inboundCancelCost(fRAList, iDFraList, distinctItinerary, config); // Inbound cancellation cost 
    double cLC = cancelLegalCost(fRAList, iDFraList, distinctItinerary, config); // Cancellation Legal Compensation Cost 
    double dLC = delayLegalCost(fRAList, iDFraList, distinctItinerary, config); // Delay legal cost 
    double fOCD = flightOperatingCostDecrease(fRAList, iDFraList, distinctItinerary, config); //Penalties for non-compliant location of aircraft 
    /* 
    f.insertAircraftPositionEndRtw(distinctAircraft, fRAList, config, positionList, aAList); // inserts the aircraft in the airports (aAList) List 
    double pNcLA = penaltyNonCompliantLocationAircraft(fRAList, iDFraList, 
    distinctAircraft, positionList, aAList, config); // Penalties for non-compliant location of aircraft 
    */ 
    Console.WriteLine(); 
    Console.WriteLine("Passenger delay cost: {0}", pDC.ToString("#.##")); 
    Console.WriteLine("Outbound cancellation cost: {0}", oCC.ToString("#.##")); 
    Console.WriteLine("Inbound cancellation cost: {0}", iCC.ToString("#.##")); 
    Console.WriteLine("Cancellation Legal Compensation Cost: {0}", cLC.ToString("#.##")); 
    Console.WriteLine("Delay legal cost: {0}", dLC.ToString("#.##")); 
    Console.WriteLine("Flight operating cost decrease: {0}", fOCD.ToString("#.##")); 
    //Console.WriteLine("Penalties for non-compliant location of aircraft: {0}", pNcLA.ToString("#.##")); 
} 

3を持っている簡単な方法は何をメソッド:値を計算するためのメソッド、コストを印刷するメソッド、合計コストを合計する第3のメソッド

+0

関数(クラスも)は唯一の機能を持つ必要があります。 – IROEGBU

答えて

0

問題が発生している場所を確認するのは少し難しいです。

しかし、オブジェクト(カスタムクラスオブジェクト)に値を取得する方法を1つ作成しないのはなぜですか。このメソッドは、必要な計算を実行できます。

次に、そのオブジェクトを取得して値を出力するメソッドを作成します。そして、そのオブジェクトをとり、合計を計算する別のものを作ってください。

あなたの質問に答えられない場合は、あなたが望むものについてもっと詳しく説明できますか?

1

少しの設定で、このコードの多くを削除してループ内ですべて実行できます。

まず、各コストの説明と金額を含むことができるクラスを定義する必要があります。

class CostRecord 
{ 
    public string Name { get; set; } 
    public double Amount { get; set; } 
} 

我々はコストを計算することができます機能と、各レコードを関連付ける必要があり、私たちは、1つの以上の特性、ComputationFunctionを追加します。プロトタイプはコードの性質上非常に複雑です。

class CostRecord 
{ 
    public string Name { get; set; } 
    public double Amount { get; set; } 
    public Func 
     < 
      List<c_flightRotationAircraft>, 
      List<c_itineraryDistFra>, 
      HashSet<string>, 
      HashSet<int>, 
      List<c_position>, 
      List<c_airportAircraft>, 
      c_config, 
      double 
     > 
     ComputationFunction { get; set; } 
} 

今、私たちはこのようになります。これは、これらのリストを必要とする:

private List<CostRecord> _costRecords = new List<CostRecord>(); 

そして、我々はおそらくあなたのコンストラクタで、どこかでそれを初期化する必要があります。

_costRecords.Add(new CostRecord { Name = "Passenger delay cost", 
            ComputationFunction = passengerDelayCost }); 
_costRecords.Add(new CostRecord { Name = "Outbound cancellation cost", 
            ComputationFunction = outboundCancelCost }); 
_costRecords.Add(new CostRecord { Name = "Inbound cancellation cost", 
            ComputationFunction = inboundCancelCost }); 
_costRecords.Add(new CostRecord { Name = "Cancellation Legal Compensation Cost", 
            ComputationFunction = cancelLegalCost }); 
_costRecords.Add(new CostRecord { Name = "Delay legal cost", 
            ComputationFunction = delayLegalCost }); 
_costRecords.Add(new CostRecord { Name = "Flight operating cost decrease", 
            ComputationFunction = flightOperatingCostDecrease }); 

今ですべての設定が完了したら、私たちのソリューションは非常に短いです:

c_files f = new c_files(); 

    foreach(var r in _costRecords) 
    { 
     r.Amount = r.ComputationFunction(fRAList, iDFraList, distinctAircraft, distinctItinerary, positionList, aAList, config); 
     Console.WriteLine("{0}: {1:#.##}", r.Name, r.Amount); 
    } 
    Console.WriteLine("Total cost: {0}", _costRecords.Sum(r => r.Amount)); 
+0

もう一つの考え方は 'CostRecord'クラス(' return $ "{Name}:{Amount:#。##}"; '' ToString() 'をオーバーライドして' foreach'で ' Console.WriteLine(r); ' –

0

メソッドを1回だけ呼び出す場合は、その合計をメソッドの戻り値として返さないのはなぜですか?この方法では、メソッドの外で合計値を使用できます。

public double printCost(List<c_flightRotationAircraft> fRAList, 
     List<c_itineraryDistFra> iDFraList, HashSet<string> distinctAircraft, HashSet<int> distinctItinerary, 
     List<c_position> positionList, List<c_airportAircraft> aAList, c_config config) 
    { 
     c_files f = new c_files(); 
     double pDC = passengerDelayCost(fRAList, iDFraList, distinctItinerary, config); // Passenger delay cost 
     double oCC = outboundCancelCost(fRAList, iDFraList, distinctItinerary, config); // Outbound cancellation cost 
     double iCC = inboundCancelCost(fRAList, iDFraList, distinctItinerary, config); // Inbound cancellation cost 
     double cLC = cancelLegalCost(fRAList, iDFraList, distinctItinerary, config); // Cancellation Legal Compensation Cost 



double dLC = delayLegalCost(fRAList, iDFraList, distinctItinerary, config); // Delay legal cost 
    double fOCD = flightOperatingCostDecrease(fRAList, iDFraList, distinctItinerary, config); //Penalties for non-compliant location 
of aircraft 
     /* 

f.insertAircraftPositionEndRtw(distinctAircraft, fRAList, config, positionList, aAList); // inserts the aircraft in the airports (aAList) List 
    double pNcLA = penaltyNonCompliantLocationAircraft(fRAList, iDFraList, 
     distinctAircraft, positionList, aAList, config); // Penalties for non-compliant location of aircraft 
    */ 
    Console.WriteLine(); 
    Console.WriteLine("Passenger delay cost: {0}", pDC.ToString("#.##")); 
    Console.WriteLine("Outbound cancellation cost: {0}", oCC.ToString("#.##")); 
    Console.WriteLine("Inbound cancellation cost: {0}", iCC.ToString("#.##")); 
    Console.WriteLine("Cancellation Legal Compensation Cost: {0}", cLC.ToString("#.##")); 
    Console.WriteLine("Delay legal cost: {0}", dLC.ToString("#.##")); 
    Console.WriteLine("Flight operating cost decrease: {0}", fOCD.ToString("#.##")); 
    //Console.WriteLine("Penalties for non-compliant location of aircraft: {0}", pNcLA.ToString("#.##")); 

return pDC + oCC + ... // whatever you want to sum. 
} 
関連する問題