Java Map-Äquivalent in C #

150

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

class Test {
  Map<Integer,String> entities;

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

Gibt es eine äquivalente Möglichkeit, dies in C # zu tun? System.Collections.Generic.Hashsetverwendet keinen Hash und ich kann keinen benutzerdefinierten Typschlüssel definieren. Ist System.Collections.Hashtablekeine generische Klasse,
System.Collections.Generic.Dictionaryhat keine get(Key)Methode

zmbq
quelle

Antworten:

181

Sie können Dictionary indizieren, Sie brauchten nicht 'get'.

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

Ein effizienter Weg, um Werte zu testen / zu erhalten, ist TryGetValue(Dank an Earwicker):

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

Mit dieser Methode können Sie schnell und ausnahmslos Werte abrufen (falls vorhanden).

Ressourcen:

Wörterbuchschlüssel

Versuchen Sie, Wert zu erhalten

boj
quelle
14
Vielleicht möchten Sie auch TryGetValue erwähnen.
Daniel Earwicker
Ist es O(lg(n))wie Java? Ich denke nicht
1
@Desolator Reads sind O (1), siehe den Abschnitt "Bemerkungen" auf der MSDN-Seite von Dictionary <TKey, TValue>
canton7
17

Wörterbuch <,> ist das Äquivalent. Es gibt zwar keine Get (...) -Methode, aber eine indizierte Eigenschaft namens Item, auf die Sie in C # direkt mit der Indexnotation zugreifen können:

class Test {
  Dictionary<int,String> entities;

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

Wenn Sie einen benutzerdefinierten Schlüsseltyp verwenden möchten, sollten Sie IEquatable <> implementieren und Equals (Objekt) und GetHashCode () überschreiben, es sei denn, die Standardgleichheit (Referenz oder Struktur) reicht aus, 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 nach dem Einfügen in ein Wörterbuch mutiert wird (z. B. weil die Mutation dazu geführt hat, dass sich sein Hashcode geändert hat).

Dave
quelle
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;
    }
}
LukeH
quelle
5
Diese Antwort ist lächerlich alt, aber Sie können einfach einen Wert zurückgeben, unabhängig vom Ergebnis von TryGetValue, da valdieser zugewiesen wird null(dh default(string)), wenn der Schlüssel nicht vorhanden ist.
dlev