Hashtables unter C# und die effektive Verwaltung von Datenmengen
-
Hallo erstmal,
ich habe da ein kleines Verständnisproblem mit den Hashtables unter .NET.
Gegeben sei eine Hashtable, die 0 bis n Hashtables speichert. Nun habe ich den besonderen Fall, dass ich weiss, das in der Hashtable der ersten Ebene nur ein einzige Eintrag existiert. Ich möchte also die Hastable abrufen, die in dieser einzigen Hashtable gespeichert ist (mir ist durchaus bewusst, das diese Formulierung etwas verwirrend klingt, aber ich schaffe es nicht, das ganze besser zu beschreiben).
Mein Lösungsweg sieht im Moment folgendermaßen aus:
foreach (object obj in ht1.Values){ Hashtable ht2 = (Hashtable)obj; String s = ht2["irgendein_key_der_zweiten_hashtable"].ToString(); }
Ich denke das ist etwas zuviel des guten, dafür dass ich weiss, das nur ein einziger Eintrag existiert, und ich nur diesen einen Eintrag benötige. Ich würde gerne direkt auf die eine existierende Hashtable zugreifen, um diese weiter zu verarbeiten, aber ich schaffe es nicht einen einzige passenden cast zu benutzen. Irgendjemand eine Idee, wie ich das eleganter lösen kann?
P.S.
Die Frage könnte natürlich auch sein, warum sich mir dieses Problem stellt. Nun, ich programmiere seit Jahren in C und bin zugegeben mit Objektorientierung ein wenig unvertraut. Zwar kenne ich die grundlegenden Prinzipien wie Vererbung oder Polymorphie, doch das ganze sinnvoll in eine Anwendung zu integrieren ist für mich schwer. Die oben genannte Lösung habe ich für eine Client-Server Applikation benötigt. Der Client schickt Anfragen an den Server, der anhand dieser Anfragen, Datensätze aus einer Datenbank abruft, und diese zurückschickt. Nun könnte ich das ganze wunderbar mit Objekten lösen, und für jede Abfrage passende Objekte generieren die zurückgeliefert werden. Doch ich will eine gewisse Flexibilität waren. Alle Datensätze sollen beliebig im nachhinein um weitere Felder erweiterbar sein. So wählte ich die Hastables. Der Client speichert die empfangenen Datensätze in Hastables. Die Hastable der ersten Ebene ist verantwortlich für die Menge der Datensätze. In jeder Hashtable liegt dann eine weitere Hastable, in der die einzigen Attribute (Name=Key) gespeichert werden. Prinzipiell finde ich diese Lösung akzeptabel, da sie mir größtmögliche Flexibilität gewährleistet und ich nicht für jeden Sonderfall extra Code schreiben muss. Wenn mir jemand einen besseren Lösungsansatz lieferen kann, mit einer Begründung warum dieser besser ist, wäre ich auch dankbar. Aber wie gesagt: ich bin C Programmierung gewöhnt und von daher leicht vorbelastet für Quick&Dirty Lösungen.
-
Hallo,
Ich bin mir nicht sicher ob ich genau verstanden habe, was Du erreichen möchtest.Ich beschreibe kurz wie ich das verstanden habe:
Du hast eine Hashtable ht1 die weitere Hashtable's als Values enthält.
Nun möchtest Du auf eine bestimmte Hashtable, die in ht1 als Value vorhanden ist zugreifen.-> Benutze den Key mit dem Du die Hashtable als Value abgespeichert hast um daraufzuzugreifen.
Hier wäre noch die Doku:
http://msdn2.microsoft.com/de-de/library/system.collections.hashtable_members(vs.80).aspxAnsonsten gibts mit Hashtable.Keys und mit Hashtable.Values die entspechenden Collections. Auch helfen könnten Hashtable.ContainsKey und Hashtable.ContainsValue.
Oder habe ich dich falsch verstanden? Möchtest Du auf den besagten Wert in der Hashtable ht1 OHNE den zugehörigen Key zugreifen?
Simon
-
Egal wie oder was, anstatt der Hashtable empfiehlt es sich das Gegenstück mit Generics zu benutzen, System.Collections.Generic.Dictionary<TKey, TValue>.
-
@simon.gysi
Prinziepiell hast du mich richtig verstanden. Allerdings ist mein Problem, dass manchmal den entsprechenden Schlüssel nicht wirklich kenne. Ich weiss nur, das ein einziges Element existieren muss. Der Keys ist mir jedoch fremd. Somit kann ich nicht direkt drauf zugreifen.
Deswegen versuchte ich mit Hastables.Keys ein wenig rumzuexperimentieren. Denn wenn ich die Schlüssel auslesen würde, würde ich nur einen finden, und diesen wollte ich anwenden. Doch das gealng mir bisher nicht. Ich habe keine Ahnung, wie ich an den Key komme, oder dafür auch eine extra foreach Schleife zu implementieren.
Vielleicht mache ich mir auch unnötig Gedanken, da meine Lösung ja funktioniert, allerdings finde ich es etwas übertrieben eine Schleife für ein einzelnen Element zu verwenden. Ich hoffe irgendwie, das ich das elegant in einer einzigen Codezeile lösen kann, ohne dass es zu unübersichtlich wird.
-
Hashtable ht1 = new Hashtable(); ht1["UnknownKey"] = new Hashtable(); IEnumerator ie = ht1.Values.GetEnumerator(); if (ie.MoveNext()) { Hashtable ht2 = (Hashtable) ie.Current; }
-
Hi Halbleiter,
mir ist nicht klar, wieso Du den Key der ersten Hashtabelle nicht kennst, aber weißt, dass nur diese eine existiert.
Aber egal, Dein Problem ist ein prinzipielles von Containern unter .NET, dank ihrer „tollen“ Schnittstelle lassen sie keinen gezielten Zugriff auf das erste oder letzte Element zu. Über den Enumerator zu gehen (indem man diese Dummy-foreach-Schleife schreibt) ist daher die einzige Lösung (oder man besorgt sich den Enumerator direkt und ruft einmal 'MoveNext' auf).