我必须计算持卡人的总账单金额,以卡为基础进入停车场。我的费率结构如下所示。停车场中的每个区域都会有一个这些价格的优先列表。
public partial class HourlyPrice
{
public int Id { get; set; }
public int DayId { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public int MinHour { get; set; }
public int MaxHour { get; set; }
public decimal Price { get; set; }
}例如,DayId允许“从13点开始,周日免费”。MinNour和'MaxHour‘允许0到2小时是免费的,其中5到6小时收费11.00兰特。StartTime和EndTime允许“18h00后收费7.00兰特,统一费率”。
我关心的是没有指定多天价格的地方。当一辆车在某一天以一种价格结构进入,而在另一天以另一种价格结构退出。在我看来,我必须按顺序访问车辆停放的每一个小时,并累积应付的金额。这似乎是一种非常昂贵的做事方式。
任何关于这种投入的建议都将不胜感激。
发布于 2013-04-02 15:50:02
我认为这个库应该能解决你所有的问题:
http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
发布于 2013-04-02 16:44:43
您可以将每个特定日期的定价策略存储在间隔树中。这棵树应该存储一天中的所有时间。除了小时限制之外,还应该保留几个信息:
flat设置为true,则这是整个期间的成本。您可以在输入中获得停车记录。我假设它们是汽车的到达和离开时间的时间戳。前两个小时是免费的,所以你“增加”了两个小时的到达时间。根据得到的时间戳,您可以构建一个三元组序列(日期、开始时间、结束时间)。它可能是空的(如果车主停放的时间少于两个小时),这种情况是微不足道的:成本为R0.00
现在,处理序列的算法应该如下所示:
cost <- 0
while (NOT is_empty(sequence)) {
dayTriplet <- pop(sequence)
down <- dayTriplet.StartTime
up <- dayTriplet.EndTime
pricingTree <- getPriceTree(dayTriplet.dayId)
while (down < up) {
node <- findNode(pricingTree, down)
nbHours <- min(up, node.up) - down
if (node.flat) {
cost <- cost + node.price
} else {
cost <- cost + nbHours*node.price
}
down <- down + nbHours
}
}这个算法有点错误,但我觉得它背后的想法值得一试。例如,如果一辆车一天停在18点以后,直到第二天4点,这个算法将解析(d,18,24)和(d+1,0,4),因此车主应该支付该期间固定费率的两倍,而不是只收一次。一个类似携带的系统应该可以解决这个问题。我只是没有集成它来留下一个相对清晰的算法。
https://stackoverflow.com/questions/15758461
复制相似问题