Guarav成爲問題的核心,也是我將其標記爲答案的原因。基於此,我設計了以下代碼來實現邏輯。它屬於兩個部分:
- 創建從儀表率
- 處理的數量與遺願清單桶列表來確定
下面的函數創建桶的列表(每個量桶對象是具有最小值,最大值和速率屬性的簡單POCO)。該列表附加到具有來自價目表api的其他屬性的電錶對象。
private Dictionary<int, RateBucket> ParseRateBuckets(string rates)
{
dynamic dRates = JsonConvert.DeserializeObject(rates);
var rateContainer = (JContainer)dRates;
var buckets = new Dictionary<int, RateBucket>();
var bucketNumber = 0;
foreach (var jToken in rateContainer.Children())
{
var jProperty = jToken as JProperty;
if (jProperty != null)
{
var bucket = new RateBucket
{
Min = Convert.ToDouble(jProperty.Name),
Rate = Convert.ToDouble(jProperty.Value.ToString())
};
if (bucketNumber > 0)
buckets[bucketNumber - 1].Max = bucket.Min;
buckets.Add(bucketNumber, bucket);
}
bucketNumber++;
}
return buckets;
}
第二個函數使用具有兩個有用屬性的計量器對象:存儲桶列表和所包含的數量。根據價目表文檔(當我閱讀它時),在超過所包含的數量之前,您纔會開始計算可計費數量。我確信有一些重構可以在這裏完成,但是有序的處理是關鍵。
我想我已經通過認識到它是一個double而不是一個整數來解決數量問題。因此,與任何單個桶相關的數量是桶最大和桶最小值之間的差值(除非我們只填充了部分桶)。
private double CalculateUsageCost(RateCardMeter meter, double quantity)
{
var amount = 0.0;
quantity -= meter.IncludedQuantity;
if (quantity > 0)
{
for (var i = 0; i < meter.RateBuckets.Count; i++)
{
var bucket = meter.RateBuckets[i];
if (quantity > bucket.Min)
{
if (bucket.Max.HasValue && quantity > bucket.Max)
amount += (bucket.Max.Value - bucket.Min)*bucket.Rate;
else
amount += (quantity - bucket.Min)*bucket.Rate;
}
}
}
return amount;
}
最後,關於層次的時間範圍的文檔不清楚。如果我根據數量獲得折扣價格,我會在什麼時間範圍內累計數量?使用api允許我每天或每小時拉取數據。我想每小時收集一次我的數據,這樣我就可以按照一天中的時間關聯我的成本。但是什麼時候實際計算賬單呢?似乎每小時都是錯誤的,每天都可能工作,但它可能只適合整個月。
計費問題在這裏被認爲是關鍵問題,您可能會更好地詢問Serverfault。 –
是什麼?這是一個關於如何使用從Usage and Rate Card api收到的信息進行計算的技術問題。 –
@SteveBrownell這不是一個編程問題。其實我不確定你的實際問題是什麼。你在說什麼米?現在沒有圍繞它的上下文。 –