Mapa Java equivalente em C #

150

Estou tentando manter uma lista de itens em uma coleção com uma chave de minha escolha. Em Java, eu simplesmente usaria o Map da seguinte maneira:

class Test {
  Map<Integer,String> entities;

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

Existe uma maneira equivalente de fazer isso em c #? System.Collections.Generic.Hashsetnão usa hash e não consigo definir uma chave de tipo personalizado System.Collections.Hashtablenão é uma classe genérica
System.Collections.Generic.Dictionarynão tem um get(Key)método

zmbq
fonte

Respostas:

181

Você pode indexar o dicionário, não precisava de 'get'.

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

Uma maneira eficiente de testar / obter valores é TryGetValue(obrigado a Earwicker):

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

Com esse método, você pode obter valores rápidos e sem exceção (se presentes).

Recursos:

Chaves de dicionário

Tente obter valor

boj
fonte
14
Talvez queira mencionar o TryGetValue também.
21119 Daniel Earwicker
É O(lg(n))como o Java? Eu acho que não
1
As leituras do @Desolator são O (1), consulte a seção Comentários da página MSDN do Dictionary <TKey, TValue>
canton7
17

Dicionário <,> é o equivalente. Embora não tenha um método Get (...), ele possui uma propriedade indexada chamada Item que você pode acessar diretamente em C # usando a notação de índice:

class Test {
  Dictionary<int,String> entities;

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

Se você deseja usar um tipo de chave personalizado, considere implementar IEquatable <> e substituir Equals (objeto) e GetHashCode (), a menos que a igualdade padrão (referência ou estrutura) seja suficiente para determinar a igualdade de chaves. Você também deve tornar seu tipo de chave imutável para evitar que coisas estranhas aconteçam se uma chave for alterada após ser inserida em um dicionário (por exemplo, porque a mutação causou alterações no código de hash).

Dave
fonte
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
fonte
5
Essa resposta é ridiculamente antiga, mas você pode simplesmente retornar valor independentemente do resultado de TryGetValue, pois valserá atribuído null(ou seja default(string)) se a chave não existir.
dlev