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

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


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).


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
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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.