Domanda

Abbiamo voluto assegnare / aggiungere un elemento a un dizionario utilizzando l'indice chiave, in questo modo:

Dictionary<string, object> dict = new Dictionary<string, object>();
dict["key"] = dict["key"] ?? "object";

Ma risulta: " La data chiave non ero presente nel dizionario ".

C'è un modo che potremmo assegnare valori a questo dizionario lo stesso del modo in cui i valori assegnare a sessioni, utilizzando nulla si fondono:

Session["Member"] = Session["Member"] ?? new Member();

Grazie

Modifica: Io in realtà cercato di ignorare l'indicizzatore da una classe figlia di dizionario, ma senza alcun risultato. Interfaccia Implementazione IDictionary sembrerebbe troppo perché abbiamo solo bisogno la funzionalità del codice qui sotto (vale a dire, nulla di ritorno, se non viene trovato chiave). Quindi penso che, forse potremmo utilizzare le estensioni come:

public static TValue [this Dictionary<TKey, TValue> thisDictionary, TKey key] {
    get { return thisDictionary.ContainsKey(key) ? thisDictionary[key] : null; }
    set { thisDictionary[key] = value; }
}

ma non funziona o anche la compilazione.

Tutti gli altri modi più semplici e quindi abbiamo potuto riutilizzare questa funzionalità indicizzatore? Grazie mille.

È stato utile?

Soluzione

Se si vuole fare questa linea:

dict["key"] = dict.ContainsKey("key") ? (dict["key"] ?? "object") : "object"; 

In alternativa:

dict["key"] = dict.ContainsKey("key") && dict["key"] == null ? dict["key"] : "object";

Modifica come da commenti:

public static TValue GetSafe(this Dictionary<TKey, TValue> thisDictionary, TKey key) 
{ 
   if (!thisDictionary.ContainsKey(key))
       thisDictionary[key] = null;

   return thisDictionary[key];
}

Questo ti permette di fare questo:

thisDictionary["randomKey"] = thisDictionary.GetSafe("randomKey") ?? "someValue";

Altri suggerimenti

Come annotato, cercando di recuperare una chiave mancante genera un'eccezione. È necessario verificare se la chiave esiste prima:

if( !Session.ContainsKey("Member") )
    Session["Member"] = new Member();

Modifica:

E per rispondere alla tua domanda; è possibile creare il proprio indicizzatore o implementare l'interfaccia IDictionary. In questo modo è possibile evitare il comportamento predefinito di un'eccezione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top