Laden...

Von String in konkreten Typ (int, double, string) konvertierten Wert im Programm ansprechen

Erstellt von andski vor 10 Jahren Letzter Beitrag vor 10 Jahren 716 Views
Hinweis von herbivore vor 10 Jahren

Abgeteilt von Konvertierung in beliebigen Typ

A
andski Themenstarter:in
9 Beiträge seit 2013
vor 10 Jahren

Hallo,

danke für deine Antwort. So habe ich es jetzt auch umgesetzt.

An dieser Stelle möchte das ganze etwas ausdehnen. Und zwar nutze ich diese Methode in einem größeren Kontext: In einer Textdatei habe ich Key-Value Paare stehen. Die Werte können Int32, Double, oder String sein. Um den Typ zu erkennen benutze ich reguläre Ausdrücke. Wird Int32 oder double erkannt, verwende ich die hier besprochene Methode, um den Wert in einen Integer oder eben Double zu konvertieren. Die Key-Value Paare werden dann in einer Hashtable gespeichert.
Hier habe ich die Möglichkeit die konvertierten Werte direkt zu speichern, oder mir einen generischen struct zu bauen, für jeden Wert eine Instanz dieses structs zu erzeugen und diesen in der Hashtable zu speichern. Da eine Hashtable alles als object speichert, bedeutet erstere Variante, dass ich ständig casten muss, wenn ich die Werte verwenden will. Bei letzterem würde der Cast wegfallen, was schon mal schön bequem wäre.

Nun zum Problem:
Bei der Verwendung der konvertierten Werte soll möglichst kein weiterer Aufwand entstehen. Das heisst, dass ich gerne sicherstellen möchte, das ein Wert einen bestimmten Typ hat. Dies ist insofern notwendig, da die Typerkennung automatisch abläuft und es auch einmal zu einer Fehlerkennung kommen kann. Bspw hat jemand an der Textdatei rumgespielt und einen Buchstaben an einen Wert, der eigentlich ein int ist, angehängt. Der Wert würde somit als String und nicht als int erkannt werden. Um diese Fehlerquellen auszuschließen müsste ich im Code ständig prüfen ob es sich tatsächlich um einen int handelt.

Ich habe für dieses Problem eine etwas unkonventionelle Lösung. Statt eines generischen structs erzeuge ich einen struct mit einer string-Variablen, einer int-Variablen und einer double-Variablen. Da ich weiss welche Typen meine Werte annehmen können, kann ich das tun. Der konvertierte Wert wird dann in der entsprechenden Variablen gespeichert. Verwende ich nun den Wert, müsste ich mir lediglich die richtige Variable aussuchen.

Wenn ich keinen Denkfehler drin habe, sollte das mein Problem lösen und einigermassen sicherstellen, dass ich nicht versuche einen string-Wert nicht in einer int-Variablen zu speichern.

Für alle, die verstanden haben, worauf ich hinaus will: Gibt es dafür eine bessere Lösung? =)

Gruss
andski

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo andski,

wenn ich dich richtig verstehe, weißt du von jedem Wert, welchen Typ er haben muss. Was hindert dich also, den Wert in den richtigen Typ zu konvertieren und in einer Variable dieses Typs zu speichern?

Mit Variable meine ich nicht unbedingt eine einfache Variable. Das kann auch ein Dictionary<String,KonkreterTyp> sein. Da du nur drei Typen hast, brauchst du auch nur (maximal) drei Dictionaries.

Die Erkennung des Typs kannst du dir im Grunde sparen. Du konvertierst Wert in den vorgesehenen bzw. gewünschten Zieltyp und wenn das nicht geht, dann knallt es eben dabei. Gleich an der Wurzel des Übels und nicht irgendwann später bei der Verwendung.

herbivore

A
andski Themenstarter:in
9 Beiträge seit 2013
vor 10 Jahren

Hallo,

Was hindert dich also, den Wert in den richtigen Typ zu konvertieren und in einer Variable dieses Typs zu speichern?

Mich hindert, dass ich nicht vorraussetzen kann, dass die Werte in der Datei auch die Vorraussetzungen erfüllen in die gewünschten Typen geparst werden zu können.
Beispiel: VAR=10.0
Ich will einen double haben, den ich so auch bekommen würde.
Aber VAR=10.xy würde ein String werden. Und dann knallt es zur Laufzeit dort, wo ich einen double verwenden will.

Unterm Strich lässt sich das Problem so zusammen fassen: Ich weiss nie, ob meine File-Reader-Klasse die Werte in die gewünschten Typen parsen kann. Das heisst, dass ich irgendwo prüfen muss, ob es sich nun tatsächlich um einen int-Wert handelt.

Meine vorgeschlagene unkonventionelle Lösung würde IMMER für jeden Typ eine Variable bereithalten, die wenigstens mit dem default-wert belegt ist. will ich dann auf den Wert einer bestimmten Variablen zugreifen sähe das irgendwie so aus:

double dbl_val = my_hash["VAR"].dblVal;

Wobei wie gesagt der Wert für den Key "VAL" im Hash eine Instanz von dem hier ist:

public struct values
{
    int intVal;
    double dblVal;
    string strVal;
}

(Nur ums mal zu verdeutlichen. Das lässt sich noch ausbauen.) Wobei halt nur eine der drei Variablen den tatsächlichen Wert (eben je nach erkanntem Typ) enthält und die anderen beiden ihre default-Werte haben.

Gruß
andski

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo andski,

ich finde, du denkst da etwas verquer.

Wenn du willst, dass es nicht knallt, dann weise gleich in der Typkonvertierungsroutine den Default-Wert zu, wenn der Wert sich nicht parsen lässt. Das geht, weil du ja weißt, welchen Typ du haben willst.

Wenn du willst, dass es knallt, dann ist es ebenfalls am besten, dass es gleich in der Typkonvertierungsroutine knallt.

Der Versuch, das Problem der nicht (richtig) geparsten Werte bis zur Verwendung der Werte zu verschieben, ist so oder so unsinnig.

herbivore