我必须计算持卡人的总可结算金额,以便以卡为基础进入停车场。我的费率结构看起来像这样。停车场的每个区域都会列出这些价格的优先列表。
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小时费用为R11.00。 StartTime
和EndTime
允许“18小时后费用R7.00,统一费率”。
我担心的是没有指定多日价格。当一辆汽车在一天内进入一个价格结构,并在另一天进入另一个价格结构时。这对我来说就像我必须按顺序访问车辆停放的每个小时并累积到期金额。这似乎是一种非常昂贵的做事方式。
非常感谢任何关于这种努力的建议。
答案 0 :(得分:3)
我认为这个图书馆可以解决你所有的问题:
http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
答案 1 :(得分:0)
您可以将每个特定日期的定价政策存储在区间树中。树应该存储一天中的所有时间。除了小时限制外,还应该提供一些信息:
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),因此所有者应该在平面上收取两倍的费用。期间的比率而不是一次。类似进位的系统应该可以解决这个问题。我只是没有集成它来留下一个相对清晰的算法。