Ho provato a verificare la presenza di null ma il compilatore avverte che questa condizione non si verificherà mai. Cosa dovrei cercare?
Ho provato a verificare la presenza di null ma il compilatore avverte che questa condizione non si verificherà mai. Cosa dovrei cercare?
Risposte:
Supponendo che si desidera ottenere il valore se la chiave non esiste, utilizzare Dictionary<TKey, TValue>.TryGetValue
:
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(L'utilizzo di ContainsKey
e poi l'indicizzatore fa cercare la chiave due volte, il che è piuttosto inutile.)
Nota che anche se stessi usando i tipi di riferimento, il controllo di null non funzionerebbe: l'indicizzatore di Dictionary<,>
genererà un'eccezione se richiedi una chiave mancante, invece di restituire null. (Questa è una grande differenza tra Dictionary<,>
e Hashtable
.)
ContainsKey
, il che è vero, perché deve estrarre anche il valore. Tuttavia, non sta facendo due ricerche.
Il dizionario genera KeyNotFound
un'eccezione nel caso in cui il dizionario non contenga la tua chiave.
Come suggerito, ContainsKey
è la precauzione appropriata. TryGetValue
è anche efficace.
Ciò consente al dizionario di memorizzare un valore null in modo più efficace. Senza che si comporti in questo modo, il controllo di un risultato nullo dall'operatore [] indicherebbe un valore nullo OPPURE l'inesistenza della chiave di input che non va bene.
Se stai solo controllando prima di provare ad aggiungere un nuovo valore, utilizza il ContainsKey
metodo:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Se stai verificando che il valore esista, utilizza il TryGetValue
metodo descritto nella risposta di Jon Skeet.
GetValueElseAdd
metodi a cui si assegna un valore (o un Func<TValue>
) per salvare anche la risoluzione sull'inserto se si intende aggiungere se non è presente. Immagino che il motivo per cui non è stato inserito nelle librerie .NET è perché il percorso di
TryGetValue
sarebbe meglio, ma se vuoi controllare se il dizionario contiene la chiave per evitare aggiunte duplicate, direi che ContainsKey
è altrettanto buono (se non migliore).
Dovresti controllare Dictionary.ContainsKey (int key) prima di provare a estrarre il valore.
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
TryGetValue
. Per fortuna, ora lo so, quindi lo saprò in futuro. Lascerò questa risposta intatta, anche se la discussione è preziosa.
TryGetValue
in un'espressione lambda. Anche se questo mi fa pensare che una nuova estensione a C # sarebbe un catch
operatore simile all'operatore di null
coalescenza.
Una classe helper è utile:
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
ContainsKey è quello che stai cercando.
Probabilmente dovresti usare:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
Il motivo per cui non puoi verificare la presenza di null è che la chiave qui è un tipo di valore.
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
Se la chiave è presente nel dizionario, restituisce il valore della chiave altrimenti restituisce 0.
Spero che questo codice ti aiuti.
TryGetValue
è sufficiente, usa value
invece diresult
Considera l'opzione di incapsulare questo particolare dizionario e fornire un metodo per restituire il valore per quella chiave:
public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};
public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}
Quindi puoi gestire il comportamento di questo dizionario.
Ad esempio qui: se il dizionario non ha la chiave, restituisce la chiave che passi per parametro.