Jump to content
Unity Insider Forum

Wert aus Hashtable als String auslesen?


AniProGuy2

Recommended Posts

Hallo liebe Community,

Ich bin gerade dabei, meinem Spiel eine eigene "Settings" funktion zu geben, also einfach eine gewisse personale Einstellbarkeit. Die dazugehörigen Werte speichere ich in einer hastable (und später dann in einer .txt), was auch super funktioniert. Allerdings ist es nun so, dass ich diese Hashtable gern auslesen würde und einige Werte dort als Strings gespeichert werden. Ein bestes Beispiel ist die Einstellung, ob Chatlogs in Spielelobbies gespeichert werden sollen oder nicht. Der entsprechende Wert ist ein String und kommt aus einem Dropdown-Menü. Diesen speichere ich dann in der Hashtable. Wenn ich ihn nun auslese und zurück zu einem String konvertiere, kann ich diesen aber nicht abfragen. Es kommt zwar kein Error, aber die Abfrage kann niemals einen postiven Wert erhalten, also true werden. Ich versteh nicht so ganz warum, aber es schonmal kein Fehler in der Abfrage, denn der Wert wird richtig abgefragt. Wenn ich allerdings eine Integer abspeichere, sie aus der Hashtable zu einem String konvertiere und dann zu einer integer, kann ich sie abfragen.

Ich verstehe das nicht so ganz, da ich auch erst seit kurzem mit Hashtables arbeite. Ich würde mich sehr freuen, wenn mir hier jemand weiterhelfen und es mir ggF. auch gleich richtig erklären könnte ^^

MfG,
AniProGuy2

Mein Code:
(die Console gibt mir nicht die "1" aus, auch wenn der Wert in der Hashtable eigentlich der Richtige ist)

if (settings["SaveLobbyChatLog"].ToString() == "Don't save")
			print (1);

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Nö, nur die doppelten Anführungsstriche müssten. Ein Apostroph ist völlig okay.

Was die eigentliche Frage angeht... warum konvertierst du da überhaupt hin und her? Schreib doch einfach strings in dein Dictionary, dann kommen da auch Strings wieder raus. Davon abgesehen kannst du den rauskommenden String ja mal ansehen:

print(settings["SaveLobbyChatLog"]);

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...

Direkte Verwendung von Strings bringt oft Probleme mit. Ich definiere meistens eine Klasse, die nur String-Konstanten enthält:

    public class Constants
    {
        public const string SaveLobbyChatLog = "SaveLobbyChatLog";
        public const string SaveWindowPosition = "SaveWindowPosition";
        // ...
    }

Dann kannst du deine Hashtable mit dieser Konstante abfragen:

if (settings[Constants.SaveLobbyChatLog].ToString() == "Don't save")
			print (1);

Vorteil: du kannst dich nicht mehr vertippen.

Das soll ja offensichtlich ein bool-Wert werden. Warum speicherst du nicht statt des fehleranfälligen "Don't save" ein "true" oder "false"? Der Wert "SaveLobbyChatLog" sagt ja schon aus, was der Wert dann bedeutet. Und nimmst das gleich noch in die Konstanten mit auf?

    public class Constants
    {
        public const string SaveLobbyChatLog = "SaveLobbyChatLog";
        public const string SaveWindowPosition = "SaveWindowPosition";
        // ...
        public const string True = "true";
        public const string False = "false";
    }

Das verändert die Abfrage auf

if (settings[Constants.SaveLobbyChatLog].ToString() == Constants.False)
			print (1);

Beim Setzen des Wertes verwendest du natürlich ebenfalls diese Konstanten:

settings.Add(Constants.SaveLobbyChatLog, Constants.True);

Schreibfehler ausgeschlossen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ Zer0Cool

Die Strings sind definitiv richtig, weil ich sie aus einer .txt in die Hashtable reinlade und dann auch direkt das abfrage, was in der .txt steht. Ich kann gar keinen Schreibfehler haben, aber natürlich habe ich das immer wieder geprüft.

 @ Hrungdak

Das ist eine ziemlich gute Idee! Ich habe zwar für mein Problem mittlerweile eine andere Lösung gefunden, aber ich werde mir das defintiv für die nächsten Male merken. Danke! :)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 8.7.2017 um 20:33 schrieb AniProGuy2:

weil ich sie aus einer .txt in die Hashtable reinlade

Kann es sein dass deine tct Datei einfach nur durch Newlines die einzelnen Einträge voneinander trennt? Wenn du die einzelnen Elemente durch string.Split voneinander in ein Array aufspaltest dann besteht die Möglichkeit dass deine Strings ein abschließendes \r enthalten. Unter Windows kommt diese Form ganz oft vor.

 

Zitat

Hallo\r\nWelt\r\nNeue Zeile\r\nTest

Zitat

 

Hallo

Welt

Neue Zeile

Test

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich es via "print" in die Konsole schreibe, dann ist dort kein \r dabei. Die Theorie klingt zwar logisch, aber ich gehe nicht davon aus, dass das bei mir der Fall ist.
.
Hier aber mal das Script, mir dem ich die .txt in die Hashtable (bzw. mittlerweile Dictionary) lade:

 

StreamReader sr = new StreamReader ("Settings/Settings.txt");
string[] import = sr.ReadToEnd ().Split ('\n');
sr.Close ();

string key;
string value;
for (int i = 0; i <= import.Length - 1; i++) {
	key = "";
	value = "";
	int index = import [i].IndexOf (":");
	for (int j = 0; j <= import [i].Length - 1; j++) {
		if (j < index)
			key += import [i] [j];
		else if (j > index)
			value += import [i] [j];
	}
	settings.Add (key, value);
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Lass dir mal die Ascii-Codes der beiden Strings ausgeben (damit siehst du auch versteckte White-Chars).
Ich habe jetzt aber mal Unicode genommen, da hat man noch eine bessere "Auflösung" (16 bit) als bei ASCII (7bit).

using UnityEngine;
using System.Collections;
using System.Text;

public class TestPrint : MonoBehaviour {

    void Start() {
        string s1 = settings["SaveLobbyChatLog"].ToString();
        OutUnicode(s1);
        string s2 = "Don't save";
        OutUnicode(s2);
    }

    void OutUnicode(string s)
    {
        byte[] ASCIIValues = Encoding.Unicode.GetBytes(s);
        string line = "";
        foreach (byte b in ASCIIValues)
        {
            line += " " + b;
        }
        Debug.Log(line);
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das sind dann 3 Carriage Return (000D) also "\r\r\r". Wenn du 3 Zeichen hinten abschneidest sollte es passen, oder besser eine Routine verwenden die alle White Chars aus einem String entfernt (wenn man alle Zeichen < 32 entfernt hat mal glaube ich schon alle erwischt).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...