2012-03-27 8 views
2

Ich habe ein Wörterbuch, das Durchmesser (in mm) und im Wert von Euro-Münzen Gastgeber:auswerten und ein Variable Schlüsselpaare eines Wörterbuch Vergleich

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} 
       }; 

So zum Beispiel einer 50 Euro-Cent-Münze hat einen Durchmesser von 24,25 mm. nach einer Bildverarbeitung erhalte ich den groben Durchmesser einer 50-Cent-Münze in einem Bild mit einem Durchmesser von 24,1 mm. Ich habe versucht, den folgenden Code zu schreiben, indem ich einen Fehler von +/- 0,2 mm berücksichtigte, aber es gibt immer den ersten Wert im Wörterbuch zurück (die 2,00-Euro-Münze). Was kann mit der Logik falsch sein?

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

ersetzen Sie nicht einen Debugger verwendet haben, nicht wahr? –

+0

Sie sollten '&&' anstelle von '||' –

Antwort

4

Sie sollten dies versuchen:

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

verwenden Ich denke, du meinst '<0.2F' – joshuahealy

+0

@appclay Ja, ich habe das bemerkt, nachdem ich es gepostet und repariert habe. sollte '<= 0.2F' sein, glaube ich. –

+0

Das ist besser :) Ich werde jetzt upvote ... – joshuahealy

6

Ich denke, man sollte die || mit && :)

+0

Genau. Diese Logik prüft zuerst, ob der Durchmesser weniger als 25,95 * oder * größer als 25,55 ist. Offensichtlich ist diese Überprüfung immer wahr, und daher gibt jede Eingabe den ersten Wert im Wörterbuch zurück. – Carson63000

+0

Einverstanden. Diese Logik scheint darauf hinzudeuten, dass, solange der Durchmesser nicht gleich dem Schlüsselwert (+ - 0,2) ist, dieser Schlüssel der gesuchte Schlüssel ist. Daher wird der erste gewählt, weil er sich immer qualifizieren wird. – GrantVS

+0

Ich denke, die Logik schlägt vor, dass @ Sean87 einen einfachen Fehler gemacht hat, den wir wahrscheinlich alle irgendwann gemacht haben. – joshuahealy

Verwandte Themen