2009-03-26 32 views
140

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:Java Map equivalente en C#

class Test { 
    Map<Integer,String> entities; 

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

¿Hay alguna manera equivalente de hacerlo en C#? System.Collections.Generic.Hashset no utiliza hash y que no se puede definir un tipo personalizado clave System.Collections.Hashtable no es una clase genérica
System.Collections.Generic.Dictionary no tiene un método get(Key)

Respuesta

165

Puede índice de diccionario, que no era necesario 'conseguir' .

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

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

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

Con este método se puede avanzar rápidamente y la excepción, menos obtener valores (si está presente).

Recursos:

Dictionary-Keys

Try Get Value

+14

También podría mencionar TryGetValue. –

+0

¿Es 'O (lg (n))' como Java one? Creo que no –

+1

Las lecturas de @Desolator son O (1), consulte la sección Observaciones de la página MSDN de Dictionary canton7

17

diccionario <,> es el equivalente. A pesar de que no tiene un GET (...) método, que tiene una propiedad indexado llamado artículo que se puede acceder en C# usando directamente índice de notación:

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 (object) 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 una clave está mutada después de haber sido insertada en un diccionario (por ejemplo, porque la mutación causó el cambio de su código 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

. Esta respuesta es ridículamente antigua, pero puede devolver el valor independientemente del resultado de 'TryGetValue', ya que a 'val' se le asignará' null' (es decir 'default (string)') si la clave no existe. – dlev