Java Map équivalent en C #

150

J'essaye de tenir une liste d'articles dans une collection avec une clé de mon choix. En Java, j'utiliserais simplement Map comme suit:

class Test {
  Map<Integer,String> entities;

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

Existe-t-il une manière équivalente de faire cela en C #? System.Collections.Generic.Hashsetn'utilise pas de hachage et je ne peux pas définir une clé de type personnalisée System.Collections.Hashtablen'est pas une classe générique
System.Collections.Generic.Dictionaryn'a pas de get(Key)méthode

zmbq
la source

Réponses:

182

Vous pouvez indexer le dictionnaire, vous n'avez pas besoin de «get».

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

Un moyen efficace de tester / obtenir des valeurs est TryGetValue(merci à Earwicker):

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

Avec cette méthode, vous pouvez obtenir rapidement et sans exception des valeurs (si présentes).

Ressources:

Dictionnaire-Keys

Essayez d'obtenir de la valeur

boj
la source
14
Vous voudrez peut-être également mentionner TryGetValue.
Daniel Earwicker
Est-ce O(lg(n))que c'est comme celui de Java? Je ne pense pas
1
@Desolator Reads are O (1), voir la section Remarks de la page MSDN de Dictionary <TKey, TValue>
canton7
17

Le dictionnaire <,> est l'équivalent. Bien qu'il n'ait pas de méthode Get (...), il possède une propriété indexée appelée Item à laquelle vous pouvez accéder en C # directement en utilisant la notation d'index:

class Test {
  Dictionary<int,String> entities;

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

Si vous souhaitez utiliser un type de clé personnalisé, vous devez envisager d'implémenter IEquatable <> et de remplacer Equals (object) et GetHashCode () sauf si l'égalité par défaut (référence ou struct) est suffisante pour déterminer l'égalité des clés. Vous devez également rendre votre type de clé immuable pour éviter que des choses étranges ne se produisent si une clé est mutée après avoir été insérée dans un dictionnaire (par exemple parce que la mutation a fait changer son code de hachage).

Dave
la source
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
la source
5
Cette réponse est ridiculement ancienne, mais vous pouvez simplement renvoyer une valeur quel que soit le résultat de TryGetValue, carval sera attribué null(c'est-à-dire default(string)) si la clé n'existe pas.
dlev