2012-03-27 56 views
2

我有承載直徑(單位mm)和值得歐元硬幣的字典:評估和一個變量與一詞典的密鑰對

CoinsDiameters = new Dictionary<float, decimal> 
       { 
        {25.75F, 2.00m}, 
        {24.25F, 0.50m}, 
        {23.25F, 1.00m}, 
        {22.25F, 0.20m}, 
        {21.25F, 0.05m}, 
        {19.75F, 0.10m}, 
        {18.75F, 0.02m}, 
        {16.25F, 0.01m} 
       }; 

因此,例如一50歐分硬幣具有24.25直徑毫米。經過一些圖像處理後,我得到直徑爲24.1毫米的圖像中的50美分硬幣的粗略直徑。我試圖通過記下+/- 0.2mm的錯誤來編寫下面的代碼,但它總是返回字典中的第一個值(2.00歐元硬幣)。邏輯有什麼問題?

public decimal GetValueForDiameter(float diameter) 
{ 
    foreach(var key in CoinsDiameters.Keys) 
    { 
     if (diameter < key + 0.2F || diameter > key - 0.2F) 
     { 
      return CoinsDiameters[key]; 
     } 
    } 

    return 0; 
} 
+1

您沒有使用調試器代替,是嗎? – 2012-03-27 23:58:13

+0

你應該使用'&&'而不是'||' – 2012-03-27 23:59:36

回答

4

你應該試試這個:

if (Math.Abs(diameter - key) <= 0.2F) 
+0

我認爲你的意思是'<0.2F' – joshuahealy 2012-03-27 23:56:37

+0

@appclay是的,我注意到我發佈並修復它之後。應該是'<= 0.2F'我相信。 – 2012-03-27 23:57:50

+0

這樣更好:)我現在upvote ... – joshuahealy 2012-03-27 23:57:59

6

我想你應該在||&& :)

+0

準確。該邏輯首先檢查直徑是否小於25.95 *或*大於25.55。顯然這個檢查總是如此,因此任何輸入都會返回字典中的第一個值。 – Carson63000 2012-03-27 23:58:56

+0

同意。這種邏輯似乎表明,只要直徑不等於鑰匙值(+ - 0.2),鑰匙就是追求的鑰匙。因此,第一個選擇是因爲它總是符合條件。 – GrantVS 2012-03-28 00:03:29

+0

我認爲這個邏輯表明@ Sean87犯了一個簡單的錯誤,我們可能都是在某個時候做出的。 – joshuahealy 2012-03-28 00:06:44