Feedback

C# - Wert(e) aus einer Hashtable herausfinden

Veröffentlicht von am 1/5/2013
(2 Bewertungen)
Über dieses Snippet kann man bei Angabe einer Hashtable alle Werte die sich in der Hashtable befinden auslesen.

Danke an Scavanger für seine Korrekturvorschläge.
Ich habe den Code nun abgeändert.

// NAMESPACE(S):
using System.Collections;



// ZUGRIFF (Beispiel):
Hashtable tabelle = new Hashtable();
tabelle["vorname"] = "max";
tabelle["nachname"] = "mustermann";
tabelle["einezahl"] = 12345678;
tabelle["wahr"] = false;

zeigeEintragAusHashtablePerSchluessel(meineHashtable);


Ausgabe:
einezahl
12345678

vorname
max

wahr
False

nachname
mustermann
/// <summary>
/// Zeigt alle Werte aus einer Hashtable an
/// ***************************************
/// </summary>
/// <param name="myHashtable">die Hashtable dessen Eintrag man betrachten moechte</param>
public static void ZeigeEintraegeAusHashtable(Hashtable myHashtable)
{
   // variable um den wert des Schluessels zu speichern
   object schluessel = "";
   object wert = "";
   
   // Eintrage durchgehen bis man alle hat...
   foreach (DictionaryEntry eintrag in myHashtable)
   {
            // speichere Werte in Variablen ab um sie spaeter zurueckgeben zu koennen
            schluessel = eintrag.Key; 
            wert = eintrag.Value;

            // Macht mit dem Schluessel und dem Wert nun was ihr wollt...
            // Mal angenommen, dass das strings sind kann man sie jetzt z. B. in der Konsole ausgeben...
            Console.WriteLine(schluessel.ToString());
            Console.WriteLine(wert.ToString());
            Console.WriteLine();
      }
}

// Methode von Scavenger: performant und unumstaendlich einen Eintrag aus einer Hashtable auslesen
// ***********************************************************************************************
public string showEntryFromHashTableByKey(Hashtable myHashtable, string key)
{
   string keyvalue = myHashtable[key].ToString();
   return keyvalue;
}
Abgelegt unter hashtable, key, schluessel, value, wert, auslesen.

5 Kommentare zum Snippet

Scavanger schrieb am 1/6/2013:
Also unperformanter und umständlicher geht's wohl kaum.

Eine Hashtable hat die Eingenschaft, das durch die Hashes der Keys die ebenfalls gespeichert werden, eben NICHT immer alle Elemente durchgegangenen werden müssen. Du hast den Sinn einer Hashtable völlig ab absurdum geführt.

Eine Hashtable sollte (wenn man nicht genau weiß was man macht) nicht mehr verwendet werden (kein Generic, daher ständig die ständigen Casts und Umwandlungen), sondern stattdessen Dictionary<TKEy, TValue>, in deinem Fall Dictionary<string, string>.

Performat, kürzer und korrekt:

string value = myHashtable["key"].ToString();


Und bei Verwendung von Dictionary (Dringend empfohlen!)spart man sich das ToString().

Außerdem enthält der Code auch noch einen Fehler: Das Argument heißt myHashtable, im foreach auf einmal iniHashtable.
Falcone schrieb am 1/6/2013:
@Scavanger
Vielen Dank für deine Hinweise Scavanger, besonders den Tipp
mit dem Dictionary-Objekt fand ich gut (kannte vorher nur Hashtable).
Ich habe nun einige Änderungen am Code vorgenommen.

Infos:
- Schwerpunkt geändert: Da der Schnippsel aufgrund seiner Länge, Langsamkeit und Redundanz definitiv unnötig war.
- Neuer Schwerpunkt ist nun alle Elemente (Schlüssel und ihre Werte) aus einer Hashtable herauszubekommen.
(Alter Schwerpunkt war es den Wert eines Schlüssels in einer Hashtable herauszufinden)
Scavanger schrieb am 1/6/2013:
Servus,

ja besser. :)

Aber kann es sein das du kaum Erfahrung in Programmieren hast insbesondere C#?

Du brauchst nicht immer die Werte in Variablen zwischenspeichern.

Console.WriteLine(eintrag.Key.ToString());

return myHashtable[key].ToString();


Besonders die zweite Methode ist dann so kurz, das man sich die Methode gleich sparen kann.
Falcone schrieb am 1/6/2013:
@Scavanger
Nein, ich habe schon ein bisschen Erfahrung in C#.
Ich finde nur das der Code durch Variablen übersichtlicher wird,
deswegen schreib ich die bei für mich neuen Snippets (lokal) auch erst immer hin.

Ich weiß auch, dass der Methodenrumpf überflüssig ist und dass ich
Umlaute in meinen Codes ruhig verwenden darf (finde ich aber nicht schoen :D).

Beispiel einer for-schleife zum initialisieren von array-elementen (Sorry mir fällt gerade nichts besseres ein)

// So wurde es mir beigebracht
string[] strArr_Namedesarrays = new string[10]; // lege ein stringarray mit 10 Elementen an
for(int i = 0; i < strArr_Namedesarrays.Length; i++) // solange aktueller arrayindex < länge des arrayindexGesamt
{
strArr_Namedesarrays[i] = ""; // Hole aktuelles array-element per index und initialisiere es
}


// So wuerde ich es heute machen
string[] Namedesarrays = new string[10]; // ohne ungarische Notation *mag ich nicht...*
for(int i = 0; i < 10 /*Namedesarrays.Length*/; Namedesarrays[i] = "", i++); // Kein Kommentar *brauch ich nicht...*


Ich denke nicht, dass ein Anfänger mit der 2. Lösung etwas anfangen könnte,
wenn noch nie eine for-schleife gesehen hat.

Da ein guter Snippet
1. leicht verständlich
2. (auch wenn) kurz
sein muss.

Ich verzichte jedoch lieber auf das 2. und schreibe dafür etwas längeren Code.
Ist halt mein Schreibstil... :)
hackman schrieb am 1/6/2013:
sorry, noch nie so ein schlechtes und unnötiges snippet gesehen ...

kann man alles innerhalb einer Zeile machen,

var dictionary = new Dictionary<string, object>();
// alles ausgeben:
Console.WriteLine(string.Join("\r\n", dictionary.Select(kv => kv.Key + "\r\n" + (kv.Value ?? "").ToString()).ToArray());

// die andere funktion ist einfach nur zu blöde die nochmals wiederzugeben



zu deinem anderen code, wie du ein array initialisiert, das ist ja auch alles andere als schön ...
fixe array längen beim iterieren im quellcode hinterlegen, wer tut sowas? nicht umsonst gibt es foreach, was immer eine performantere und sicherere methode ist als eine for schleife ...
das initialisieren geht auch ganz einfach mit
var StringArray = Enumerable.Range(0, 10).Select(i => "").ToArray(); 
 

Logge dich ein, um hier zu kommentieren!