2017-10-18 57 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. 
}