Jump to content
Unity Insider Forum
AniProGuy2

Wert aus Hashtable als String auslesen?

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

 

Share this post


Link to post
Share on other sites

möglicherweise irre ich mich auch aber vielleicht liegt es an dem String den Du vergleichst, da ist ein ' drin und das must Du vielleicht mit \ entwerten?

also "Don\'t save" ??

Share this post


Link to post
Share on other sites

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"]);

 

  • Like 1

Share this post


Link to post
Share on other sites

Ich antworte vielleicht etwas spät, aber genau das mache ich gerade ^^

Ich lese Strings aus einem Dictionary aus und vergleiche sie, was aber genauso wenig funktioniert...

Share this post


Link to post
Share on other sites

Schau halt mal was im String drin steht:
"Don't save" oder
"Don`t save" oder 
"Don´t save" 
Notfalls mal die ASCII-Codes des Strings ausgeben lassen.
 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

@ 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! :)

 

Share this post


Link to post
Share on other sites
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

 

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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).

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×