2017-10-18 56 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個方法:一個用於計算價值,另一個用於打印成本,第三個用於總和總成本?

+0

有一件事你應該永遠記住,一個功能(甚至類)應該有一個且只有一個功能。 – IROEGBU

回答

0

這有點難以看出你有什麼問題。

但是,爲什麼不創建一個方法來檢索對象(自定義類對象)的值。該方法可以執行任何所需的計算。

然後,創建一個接受該對象並打印值的方法。並做另一個接受該對象並計算總數。

如果這不能回答你的問題,你能更詳細地描述你想要的嗎?

1

通過一些設置,您可以刪除大部分代碼,並在循環中完成所有操作。

首先,您需要定義一個可以包含每個成本的描述和金額的類。

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

我們需要每個記錄與可以計算的成本函數相關聯,所以我們增加一個屬性,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類中的'ToString()'('return $「{Name}:{Amount:#。##}」;'這樣在'foreach'中你可以' Console.WriteLine(R);' –

0

如果你只想調用一次該方法,爲什麼你不返回該方法的返回值?這樣,您就可以使用和值的方法外:

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