2013-05-02 55 views
0

我想寫一個'十進制'的擴展方法,計算給定數字相對於給定的較低和較高範圍的值。我知道這聽起來有點奇怪,所以這裏是一個具體的例子。C#擴展方法來計算範圍之間的位置

比方說,有一個工資等級制度在辦公場所的特定地點和工資標準類別如下..

  • CAT1(0 - 20小時)= $ 20 /小時
  • CAT2(20 - 30小時)= $第22 /小時
  • 的Cat3(30 - 40小時)= $ 24 /小時
  • 3,4,5(40 - 50小時)= $ 26 /小時
  • 五類(50+小時)= $ 28 /小時

所以......

  • 如果一個人在一個給定的每週工作14個小時,他們會賺(14 * 20)
  • 如果一個人在一個給定的每週工作27小時,他們會賺(20 * 20)+(7 * 22)
  • 如果一個人在一給定的每週工作38小時,它們將獲得(20 * 20)+(10 * 22)+(8 * 24)

等。

我放在一起的擴展方法看起來像這樣,它的目的是返回一個小數,告訴我它是否落入給定的範圍內。如果是這樣,它告訴我多少。如果不是,則返回零或該範圍的最大值。說實話,這似乎不對。

任何人都可以驗證這是正確的邏輯,也許如果有無論如何優化它?

public static decimal ValueBetween(this decimal m, decimal lower, decimal upper = decimal.MaxValue) 
{ 
    return (m > lower) 
     ? (m > upper) 
      ? upper - lower 
      : m - lower 
     : 0m; 
} 

示例用法與期望輸出

((decimal)14).ValueBetween(0, 20) = 14 
((decimal)24).ValueBetween(0, 20) = 20 
((decimal)24).ValueBetween(20, 30) = 4 
((decimal)24).ValueBetween(30, 40) = 0 
((decimal)150).ValueBetween(40) = 110 

感謝。

+0

你需要做的第一件事就是要更加rigerous指定的範圍。看起來他們應該是半開放的時間間隔,但是就目前而言(例如)30小時的數字出現在* 2 *行中。因此,如果我工作30小時,我能獲得24美元/小時還是22美元/小時? – 2013-05-02 06:39:13

+0

@MthetheWWatson嗨,範圍由第三方指定,但您的問題的答案是他們會收到(20 * 20)+(10 * 22)。 – Grant 2013-05-02 06:45:13

回答

1

我覺得你有什麼是好的,但也許你可以讓它多一點可讀性:

public static decimal ValueBetween(this decimal m, decimal lower, decimal upper = decimal.MaxValue) 
{ 
    if (m < lower) return 0M; 
    if (m > upper) return upper - lower; 
    return m - lower; 
}