2012-02-21 77 views
1

我正在尋找一些有關邏輯問題的幫助,並希望有人可以通過使用C#和LINQ以高效的方式幫助我解決問題。使用C#和LINQ重新評估值

我服務的下面的列表中有不同的術語:

Item  | RecurringMonthlyCharge | Term | Commission 
------------------------------------------------------- 
Service 1 | $10.00     | 12 | $100.00 
Service 2 | $12.00     | 18 | $200.00 
Service 3 | $14.00     | 12 | $300.00 

我的目標是通過$ X降低總佣金後均勻地重新分配的RecurringMonthlyCharge場(考慮到「項」)。

例如,如果我將總佣金折扣50.00美元,我想在三條線上劃分50美元,並考慮該術語。

使用「服務1」爲例,這將制定出爲:

10 - (50/12) = $5.83/mo 

我的問題是如何做到這一點在所有線路比例考慮到不同期限長一段時間。也許通過一個共同的因素或加權技術?

的幾點:

  • 委員會是術語(即服務1有$ 100.00佣金 支付的基礎上12個月的協議)
  • 施加的總折扣的,必須 扣除均勻從月度經常性費用中,考慮到 賬戶期限,總計最終折扣金額(在我的 示例中爲50美元)。

嘗試#1:

private static decimal GetRecurringCostEquiv(List<QuotationItemViewModel> items) 
     { 

      var discVal = GetDiscounts(items, 2); 
      decimal? result = 0.00M; 

      decimal factor = 1.00M/items.Where(x => x.ProductTypeId == 2).Sum(i => i.RecurringTerm ?? 0); 
      result = items.Select(i => i.RecurringCostCore - i.RecurringTerm * factor * discVal).Sum(); 

      return result ?? 0.00M; 
     } 
+0

在這種情況下,應該不是10 - (50 *(12 /(12 + 18 + 12))? – flq 2012-02-21 10:16:27

+0

你可以擴展「**總佣金」和分裂線?在你的例子中,似乎所有50美元的佣金削減已經應用到服務1? – AakashM 2012-02-21 10:18:51

+0

@AakashM - 在我的例子中,它適用於單行。我的要求是根據總折扣減少每條線的重複月度收費。 – Nick 2012-02-21 10:20:36

回答

2

根據你的例子你不是嗎?現在

var listOfResults = 
    Items.Select(i => i.RecurringMonthlyCharge - (Discount/i.Term)) 

,如果你實際上要減少這種比例,最簡單的就是用所有條款的總和爲您因素的基礎:

double factor = 1.0/Items.Sum(i => i.Term); 
var listOfResults = 
    Items.Select(i => i.RecurringMonthlyCharge - i.Term * factor * Discount)) 

如果您的數據集是巨大的,一些其他的方法可能要使用,但合理的尺寸應該工作以及

+0

感謝您更新您的答案,我如何在第二個示例中應用折扣?它絕對接近我想要的位置。 – Nick 2012-02-21 10:37:46

+0

那麼,選擇的結果是您的新RecurringMonthlyCharge,對嗎?因此,將舊值替換爲新的,這可以在foreach循環中完成 – flq 2012-02-21 10:45:49

+0

感謝您對我的耐心,但是我還沒有完全理解它,我唯一的意見是「總折扣」,它似乎並沒有在第二次使用 – Nick 2012-02-21 10:50:34

0

簡單的僞代碼: RecurringMonthlyCharge[i] = $50 * RecurringMonthlyCharge[i]/SUM(RecurringMonthlyCharge)

具體來說,你結了13.88,$ 16.66,$ 19,44。那是你在想什麼?

+0

或用'SUM(新佣金)= $ 600 - $ 50 = $ 550'取代'$ 50'我認爲... – CyberDude 2012-02-21 10:17:14

+0

感謝您的回覆,但這會將它平均分配到各行中。我想考慮這個術語(因此#2將爲9.22美元(12 - (50/18))。此外,如果佣金減少,則蒙特利經常性收費會減少。 – Nick 2012-02-21 10:18:47

+0

爲了清楚起見,我添加了幾個要點。 – Nick 2012-02-21 10:25:43

0

如果我要求正確接下來應該工作:


  const double discout = 50; 
      var items = new List<Service>() 
      { 
      new Service{Item = "Service1", RecurringMonthlyCharge = 10, Term = 12, Commision = 100}, 

      new Service{Item = "Service2", RecurringMonthlyCharge = 12, Term = 18, Commision = 200}, 

      new Service{Item = "Service3", RecurringMonthlyCharge = 14, Term = 12, Commision = 300} 
          }; 
      //calculate total terms 
      double totalTerms = items.Sum(x => x.Term); 
      var searchedItems = items.Select(service => service.RecurringMonthlyCharge - (discout/totalTerms)*service.Term);