2009-03-26 3 views
140

Ich versuche, eine Liste von Elementen in einer Sammlung mit einem Schlüssel meiner Wahl zu halten. In Java würde ich Map einfach wie folgt verwenden:Java Map entspricht in C#

class Test { 
    Map<Integer,String> entities; 

    public String getEntity(Integer code) { 
    return this.entities.get(code); 
    } 
} 

Gibt es einen entsprechenden Weg, dies in C# zu tun? System.Collections.Generic.Hashset nicht verwendet nicht Hash und ich kann nicht einen benutzerdefinierten Typ Schlüssel System.Collections.Hashtable ist keine generische Klasse
System.Collections.Generic.Dictionary verfügt nicht über eine get(Key) Methode

Antwort

165

Sie können Index Wörterbuch, nicht wahr brauchen ‚get‘ definieren .

Dictionary<string,string> example = new Dictionary<string,string>(); 
... 
example.Add("hello","world"); 
... 
Console.Writeline(example["hello"]); 

Eine effiziente Art und Weise zu testen/get Wert ist TryGetValue (thanx zu Earwicker):

if (otherExample.TryGetValue("key", out value)) 
{ 
    otherExample["key"] = value + 1; 
} 

Mit dieser Methode können Sie schnell und können ausnahme weniger Werte erhalten (falls vorhanden).

Ressourcen:

Dictionary-Keys

Try Get Value

+14

Möchte auch TryGetValue erwähnen. –

+0

Ist es "O (lg (n))" wie Java? Ich denke nicht –

+1

@Desolator liest, sind O (1), finden Sie im Abschnitt Bemerkungen von Dictionary MSDN-Seite – canton7

17

Wörterbuch <,> ist das Äquivalent. Während es keine Get hat (...) Methode, ist es eine indizierte Eigenschaft namens Artikel, die Sie in C# zugreifen können direkt Index-Notation:

class Test { 
    Dictionary<int,String> entities; 

    public String getEntity(int code) { 
    return this.entities[code]; 
    } 
} 

Wenn Sie einen benutzerdefinierten Schlüsseltyp verwenden mögen dann sollten Sie die Implementierung von IEquatable <> und das Überschreiben von Equals (object) und GetHashCode() in Betracht ziehen, es sei denn, die Standardgleichheit (Referenz oder Struktur) ist ausreichend, um die Gleichheit der Schlüssel zu bestimmen. Sie sollten Ihren Schlüsseltyp auch unveränderlich machen, um zu verhindern, dass seltsame Dinge passieren, wenn ein Schlüssel mutiert wird, nachdem er in ein Wörterbuch eingefügt wurde (z. B. weil die Mutation seinen Hashcode verändert hat).

10
class Test 
{ 
    Dictionary<int, string> entities; 

    public string GetEntity(int code) 
    { 
     // java's get method returns null when the key has no mapping 
     // so we'll do the same 

     string val; 
     if (entities.TryGetValue(code, out val)) 
      return val; 
     else 
      return null; 
    } 
} 
+5

Diese Antwort ist lächerlich alt, aber Sie können einfach Wert unabhängig von dem Ergebnis von 'TryGetValue' zurückgeben, da 'val'' null' (dh 'default (string)') zugewiesen wird, wenn der Schlüssel nicht existiert. – dlev