2009-03-10 3 views
4

Ich habe einen Datenleser. Ich möchte den Wert darin mit dem Wert 42 vergleichen. Ich weiß, dass es ein ganzzahliger Typ ist (z. B. was MySQL INT, TINYINT, SMALLINT, , BIGINT, JUMBODELUXEINT usw. nennt). Ich möchte den tatsächlichen Typ nicht in den C# -Code verdrahten. Das Beste, was ich gekommen sind mit istDieses Objekt ist ein integraler Typ. Kann ich den Wert in weniger als fünf Zeilen Code abrufen?

object x = reader.GetValue(i); 
uint k = x is byte ? (byte) x 
    : x is short ? (uint) (short) x 
    : x is ushort ? (ushort) x 
    : x is int ? (int) (int) x 
    : (uint) x; 
if (k == 42) { ... } 

Das scheint unglaublich langatmig. Ich habe versucht, Equals verwenden, aber verschiedene Typen mit dem gleichen Wert scheinen nicht als gleich zu testen.

Gibt es einen besseren Weg?

+0

integral oder interger-al? – StingyJack

+0

Verwenden Sie 'uint k = x ist nicht? (uint) x: (uint) Convert.ToInt32 (x)); '. Siehe http://stackoverflow.com/questions/10022383/, die Jon Skeets Antwort auf eine Erklärung erweitert. –

Antwort

9

Gerade Convert.ToUInt32(object) Überprüfung ... yup, es funktioniert gut:

using System; 

class Test 
{ 
    static void Main() 
    { 
     Check((byte)10); 
     Check((short)10); 
     Check((ushort)10); 
     Check((int)10); 
     Check((uint)10); 
    } 

    static void Check(object o) 
    { 
     Console.WriteLine("Type {0} converted to UInt32: {1}", 
          o.GetType().Name, Convert.ToUInt32(o)); 
    } 
} 

Mit anderen Worten, kann Ihr Code sein:

object x = reader.GetValue(i); 
uint k = Convert.ToUInt32(x); 
if (k == 42) { ... } 

Alternativ gegeben, dass alle uint s darstellbar wie lange, wenn Sie einen Datenleser verwenden, können Sie versuchen ? Ich weiß nicht, ob die Konvertierung für Sie erledigt wird, aber es ist wahrscheinlich einen Versuch wert.

+0

Schließen Sie '-10' anstelle von' 10' an und beobachten Sie, was passiert. Siehe http://stackoverflow.com/questions/10022383 –

6
if(Convert.ToUInt32(reader.GetValue(i)) == 42) { ... } 
0

Ich bin mir nicht sicher, ob ich Sie richtig verstehe, aber ich denke, das sollte funktionieren:

int x = int.Parse(reader.GetValue(i).ToString()); 
if(x == 42) { // do your logic } 
+0

Konvertieren von etwas in eine Zeichenfolge und zurück scheint eine ziemlich hässliche Möglichkeit, eine einfache numerische Konvertierung, IMO. –

+0

Einverstanden! obwohl ich eigentlich nicht weiß, wie Convert.ToX funktioniert, aber ich dachte, dass es zuerst in eine Zeichenkette umgewandelt werden muss. – Galilyou

2

Sie tun können, auch Skeet und Daniels Antworten in umgekehrter Reihenfolge wie folgt aus:

if (k == Convert.ChangeType(42, k.GetType()) { ... } 

I habe es aber nicht getestet.

+0

+1 nur dafür, der Freak im Raum zu sein, der es gegenüber tun muss! :) –

0

Sie können dies versuchen:

unit k = Convert.ToUInt32(x); 

würden Sie besser bedient werden Ihre Variablen umbenennen, though. 1 Buchstabe Variablen sind sooo letzte Woche.

+0

Dies ist nicht der echte Code, und es würde keinen Variablennamen geben müssen, wenn C# keine Allergie hat, Zahlen miteinander zu vergleichen ...! – pdc

+0

Es ist der Preis, den Sie für die Verwendung einer statisch getippten Sprache bezahlen. Neal Ford nennt es "Bürokratie". –

0

sollte diese Arbeit:

object x = reader.GetValue(i); 

uint k; 
try 
{ 
    k = Convert.ToUInt32(x); 
} 
catch(InvalidCastException e) { ... } 
if (k == 42) { ... } 
Verwandte Themen