2017-12-15 26 views
3

So bekommen habe ich diese Hashtableeinen bestimmten Schlüssel aus einer Hash-Tabelle

Hashtable Months = new Hashtable(); 
Months.Add(0, "JANUARY"); 
Months.Add(1, "FEBRUARY"); 
Months.Add(2, "MARCH"); 
Months.Add(3, "APRIL"); 
Months.Add(4, "MAY"); 
Months.Add(5, "JUNE"); 
Months.Add(6, "JULY"); 
Months.Add(7, "AUGUST"); 
Months.Add(8, "SEPTEMBER"); 
Months.Add(9, "OCTOBER"); 
Months.Add(10, "NOVEMBER"); 
Months.Add(11, "DECEMBER"); 

Ich möchte für den Benutzer im Monat zB der Lage sein, „Mai“ eingeben Index [4] aus einem Array abgerufen werden innerhalb mein Programm.

string Month = Console.ReadLine(); 

Grundsätzlich zum Abrufen des Index von der Nummer des entsprechenden Monats eingegeben.

+4

Warum nicht verwenden '' 'Wörterbuch ()' '' gibt es einen '' 'TryGetValue()' '' Methode – FrankM

Antwort

3

Versuchen Sie, diese

var key = Months.Keys.Cast<int>().FirstOrDefault(v => Months[v] == "MAY"); 

Hinweis: Vergessen Sie nicht, diesen Namensraum gehören - using System.Linq;

+0

diese Mitteilung nicht ganz verstehen, aber es scheint, Wie es funktionierte, würde ich einen Zusammenbruch oder eine Erklärung wirklich schätzen. Vielen Dank, obwohl –

+0

Für jeden Schlüssel in der Hashtabelle, überprüfen Sie es Wert und geben Sie die erste, die den Monat entspricht (oder Null, wenn nicht gefunden) –

+0

@ K.John: In Hashtabelle auf den Wert zugreifen Syntax ist - 'YourHashTable [Schlüssel] '. Hier in Ihrer HashTable ist der Schlüssel vom Typ "int" und der Wert vom Typ "string". Um also einen Schlüssel vom Typ int zu erhalten, müssen wir ihn zuerst in int umwandeln und die FirstOrDefault-Methode von linq verwenden, die intern durch jeden Schlüssel iteriert und den passenden Wert findet und den zugehörigen Schlüssel zurückgibt. –

0

Erhalten Sie Elemente aus Ihrem Hashtable in DictionaryEntry Format

foreach (DictionaryEntry e in Months) 
{ 
    if ((string)e.Value == "MAY") 
    { 
     //get the "index" with e.Key 
    } 
} 
0

Sie können es ausführen nur mit eine Schleife;

public List<string> FindKeys(string value, Hashtable hashTable) 
    { 
     var keyList = new List<string>(); 
     IDictionaryEnumerator e = hashTable.GetEnumerator(); 
     while (e.MoveNext()) 
     { 
      if (e.Value.ToString().Equals(value)) 
      { 
       keyList.Add(e.Key.ToString()); 
      } 
     } 
     return keyList; 
    } 

Verwendung;

var items = FindKeys("MAY",Months); 
+0

Danke, ich werde deine Methode ausprobieren. –

0

Wenn Sie den Index aus dem Monatsnamen nachschlagen möchten, ein Dictionary<string, int> wäre besser geeignet. Der Grund, warum ich die Parameter vertauscht habe, ist, dass wenn du nur den Index nachschlagen willst und nicht umgekehrt, dies viel schneller geht.

Sie sollten das Wörterbuch als Groß- und Kleinschreibung erklären, so dass es zum Beispiel erkennt may, May, mAy und MAY als die gleiche Sache:

Dictionary<string, int> Months = new Dictionary<string, int>(StringComparison.OrdinalIgnoreCase); 

Dann ist es nur TryGetValue() method verwenden, wann immer Sie wollen, um den Monat zu erhalten Index:

int MonthIndex = 0; 
if(Months.TryGetValue(Month, out MonthIndex)) { 
    //Month was correct, continue your code... 
else { 
    Console.WriteLine("Invalid month!"); 
} 
Verwandte Themen