Mapa de Java equivalente en C #

150

Estoy tratando de mantener una lista de elementos en una colección con una clave de mi elección. En Java, simplemente usaría Map de la siguiente manera:

class Test {
  Map<Integer,String> entities;

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

¿Hay una forma equivalente de hacer esto en C #? System.Collections.Generic.Hashsetno usa hash y no puedo definir una clave de tipo personalizada System.Collections.Hashtableno es una clase genérica
System.Collections.Generic.Dictionaryno tiene un get(Key)método

zmbq
fuente

Respuestas:

181

Puede indexar Dictionary, no necesitaba 'get'.

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

Una forma eficiente de probar / obtener valores es TryGetValue(gracias a Earwicker):

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

Con este método, puede obtener valores rápidos y sin excepciones (si están presentes).

Recursos:

Diccionario-llaves

Intenta obtener valor

boj
fuente
14
Es posible que desee mencionar TryGetValue también.
Daniel Earwicker
¿Es O(lg(n))como Java uno? Creo que no
1
Las lecturas de @Desolator son O (1), consulte la sección de Comentarios de la página MSDN del Diccionario <TKey, TValue>
canton7
17

El diccionario <,> es el equivalente. Si bien no tiene un método Get (...), sí tiene una propiedad indexada llamada Item a la que puede acceder en C # directamente usando la notación de índice:

class Test {
  Dictionary<int,String> entities;

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

Si desea utilizar un tipo de clave personalizada, entonces debería considerar implementar IEquatable <> y anular Equals (objeto) y GetHashCode () a menos que la igualdad predeterminada (referencia o estructura) sea suficiente para determinar la igualdad de claves. También debe hacer que su tipo de clave sea inmutable para evitar que sucedan cosas extrañas si se muta una clave después de que se haya insertado en un diccionario (por ejemplo, porque la mutación provocó un cambio en su código hash).

Dave
fuente
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
fuente
55
Esta respuesta es ridículamente antigua, pero puede devolver el valor independientemente del resultado de TryGetValue, ya valque se asignará null(es decir, default(string)si la clave no existe).
dlev