Odpowiednik mapy Java w C #

150

Próbuję przechowywać listę elementów w kolekcji za pomocą wybranego przeze mnie klucza. W Javie po prostu użyłbym Map w następujący sposób:

class Test {
  Map<Integer,String> entities;

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

Czy istnieje równoważny sposób zrobienia tego w C #? System.Collections.Generic.Hashsetnie używa skrótu i ​​nie mogę zdefiniować klucza typu niestandardowego, System.Collections.Hashtablenie jest klasą ogólną
System.Collections.Generic.Dictionary, nie ma get(Key)metody

zmbq
źródło

Odpowiedzi:

181

Możesz zindeksować słownik, nie potrzebujesz polecenia „pobierz”.

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

Skutecznym sposobem testowania / pobierania wartości jest TryGetValue(dzięki Earwicker):

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

Dzięki tej metodzie możesz szybko i bez wyjątków uzyskać wartości (jeśli są obecne).

Zasoby:

Dictionary-Keys

Spróbuj uzyskać wartość

boj
źródło
14
Może warto wspomnieć o TryGetValue.
Daniel Earwicker,
Czy jest O(lg(n))podobny do Java One? Myślę, że nie
1
@Desolator Reads are O (1), zobacz sekcję Uwagi na stronie MSDN Dictionary <TKey, TValue>
canton7
17

Słownik <,> jest odpowiednikiem. Chociaż nie ma metody Get (...), ma indeksowaną właściwość o nazwie Item, do której można uzyskać dostęp w C # bezpośrednio za pomocą notacji indeksu:

class Test {
  Dictionary<int,String> entities;

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

Jeśli chcesz użyć niestandardowego typu klucza, powinieneś rozważyć zaimplementowanie IEquatable <> i zastąpienie Equals (object) i GetHashCode (), chyba że domyślna (referencyjna lub strukturalna) równość jest wystarczająca do określenia równości kluczy. Powinieneś także uczynić swój typ klucza niezmiennym, aby zapobiec dziwnym rzeczom, które będą się dziać, jeśli klucz zostanie zmutowany po wstawieniu go do słownika (np. Ponieważ mutacja spowodowała zmianę jego kodu skrótu).

Dave
źródło
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
źródło
5
Ta odpowiedź jest absurdalnie stara, ale możesz po prostu zwrócić wartość niezależnie od wyniku TryGetValue, ponieważ valzostanie przypisana null(tj. default(string)), Jeśli klucz nie istnieje.
dlev