Java Map equivalente in C #


150

Sto cercando di tenere un elenco di elementi in una raccolta con una chiave di mia scelta. In Java, userò semplicemente Map come segue:

class Test {
  Map<Integer,String> entities;

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

Esiste un modo equivalente per farlo in C #? System.Collections.Generic.Hashsetnon usa l'hash e non riesco a definire una chiave di tipo personalizzata System.Collections.Hashtablenon è una classe generica
System.Collections.Generic.Dictionarynon ha un get(Key)metodo

Risposte:


182

Puoi indicizzare il dizionario, non hai bisogno di 'get'.

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

Un modo efficiente per testare / ottenere valori è TryGetValue(grazie a Earwicker):

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

Con questo metodo puoi ottenere valori veloci e senza eccezioni (se presenti).

risorse:

Dizionario-Keys

Prova a ottenere valore


14
Forse vorrei menzionare TryGetValue.
Daniel Earwicker,

È O(lg(n))come quello di Java? Penso di no

1
Le letture di @Desolator sono O (1), vedere la sezione Osservazioni della pagina MSDN del dizionario <TKey, TValue>
canton7,

17

Il dizionario <,> è l'equivalente. Sebbene non abbia un metodo Get (...), ha una proprietà indicizzata chiamata Item a cui puoi accedere direttamente in C # usando la notazione dell'indice:

class Test {
  Dictionary<int,String> entities;

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

Se si desidera utilizzare un tipo di chiave personalizzato, è necessario prendere in considerazione l'implementazione di IEquatable <> e l'override di Equals (oggetto) e GetHashCode () a meno che l'uguaglianza predefinita (riferimento o struct) sia sufficiente per determinare l'uguaglianza delle chiavi. Dovresti anche rendere immutabile il tuo tipo di chiave per evitare che accadano cose strane se una chiave viene modificata dopo che è stata inserita in un dizionario (ad es. Perché la mutazione ha causato la modifica del suo codice 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
Questa risposta è ridicolmente vecchia, ma puoi semplicemente restituire valore indipendentemente dal risultato di TryGetValue, poiché valverrà assegnato null(cioè default(string)) se la chiave non esiste.
dlev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.