2012-03-27 14 views
2

Iは、ユーロ硬貨の直径(単位: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の直径を有しますmm。何らかの画像処理をした後、直径24.1mmの画像に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

デバッガを使用していないと置き換える必要がありましたと思いますか? –

+0

あなたは '||'の代わりに '&&'を使うべきです –

答えて

4

あなたはこれを試してみてください:

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

私はあなたが '<0.2F'を意味すると思います – joshuahealy

+0

@appclayはい私はそれを投稿して修正した直後に気付きました。 '<= 0.2F'でなければなりません。 –

+0

それは良いです:)私は今upvoteよ... – joshuahealy

6

を、私はあなた、あなたが||&& :)

+0

正確に。その論理はまず、直径が25.95 *または* 25.55よりも大きいかどうかをチェックします。明らかに、このチェックは常に真であり、したがって、すべての入力は辞書の最初の値を返します。 – Carson63000

+0

合意。この論理は、直径がキー値(±0.2)と等しくない限り、そのキーが求められるキーであることを示唆していると思われる。したがって、常に最初のものが選択されるため、最初のものが選択されます。 – GrantVS

+0

私はロジックが、@ Sean87はおそらくすべてがある時点で作ったという単純な間違いを示唆していると思います。 – joshuahealy