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.