Ho provato a verificare null, ma il compilatore avverte che questa condizione non si verificherà mai. Cosa dovrei cercare?Cosa succede alla ricerca del dizionario C# <int, int> se la chiave non esiste?
risposta
Supponendo che si desidera ottenere il valore se la chiave fa 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
}
(Usando ContainsKey
e poi il l'indicizzatore lo fa apparire la chiave due volte, il che è abbastanza inutile.)
si noti che, anche se si erano utilizzando tipi di riferimento, il controllo di nulla non avrebbe funzionato - l'indicizzatore per Dictionary<,>
un'eccezione se si richiede una chiave mancante, invece di ritornare null. (Questa è una grande differenza tra Dictionary<,>
e Hashtable
.)
Se si sta solo controllando prima di tentare di aggiungere un nuovo valore, utilizzare il metodo ContainsKey
:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Se stai controllando che il valore esiste, utilizzare il metodo TryGetValue
come descritto nella risposta di Jon Skeet .
TryGet è meglio –
Coz si sta risolvendo la ricerca della chiave attraverso la tabella hash due volte se si ottiene immediatamente dopo l'Contiene. Wintellect PowerCollections ha anche i metodi 'GetValueElseAdd' che danno un valore (o un' Func
@rub: Credo che ciò dipenda dallo scopo del codice. Se si desidera utilizzare il valore, concordo sul fatto che 'TryGetValue' sarebbe meglio, ma se si desidera verificare se il dizionario contiene la chiave per evitare aggiunte duplicate, direi che' ContainsKey' è altrettanto buono (se non migliore). –
Controllare la voce Dictionary.ContainsKey (chiave int) 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.
}
Perché vuoi farlo fare la ricerca due volte? –
@Jon perché di solito si legge meglio – mookid8000
@mookid: Non è a mio avviso. L'idea è di cercare la chiave e prendere una linea di condotta se viene trovata, e un'altra linea di condotta altrimenti, giusto? –
ContainsKey è quello che stai cercando.
Probabilmente si dovrebbe usare:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
Il motivo per cui non è possibile verificare la presenza di nulla è che la chiave qui è un tipo di valore.
Il tipo del valore è in qualche modo irrilevante, poiché il controllo di null non avrebbe l'effetto desiderato. –
@Johannes, la soluzione di Jon è ovviamente molto meglio, ma il richiedente ha affermato che ha controllato se la chiave esiste, ed è un dizionario
Dictionary genera un'eccezione KeyNotFound
nel caso in cui il dizionario non contiene la chiave.
Come suggerito, ContainsKey
è la precauzione appropriata. TryGetValue
è anche efficace.
Ciò consente al dizionario di memorizzare un valore di null in modo più efficace. Senza il suo comportamento in questo modo, il controllo di un risultato nullo dall'operatore [] indicherebbe o un valore nullo OPPURE la non esistenza della chiave di input che non va bene.
Ulteriori informazioni sono disponibili all'indirizzo MSDN: http://msdn.microsoft.com/en-gb/library/9tee9ht2.aspx – cyberzed
una classe di supporto è a portata di mano:
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;
}
}
- 1. Cosa succede quando avviene la collisione dell'hash nella chiave del dizionario?
- 2. Ricerca efficiente del dizionario?
- 3. Eliminare una voce di dizionario, se la chiave esiste
- 4. Python Dizionario ritorno chiave richiesto se il valore non esiste
- 5. modo abbreviato per creare la chiave del dizionario se non esiste
- 6. cosa succede se non risolviamo o rifiutiamo la promessa
- 7. Cosa succede se nuovo fallisce?
- 8. dizionario Python - ricerca binaria per una chiave?
- 9. Ottieni la chiave del dizionario utilizzando il valore del dizionario
- 10. Lista dizionario <chiave, Lista <Value>> - C#
- 11. C# Espandere Lista semplice <T> dizionario <T, ICollection <int>>
- 12. Navigare nel dizionario <string, int> C#
- 13. Cosa succede veramente quando compilo int main; in C
- 14. Esiste il dizionario <Key,Value> senza chiave univoca?
- 15. Cosa restituirà array_column se un nome chiave non esiste?
- 16. C# dizionario ottenere la chiave del valore minimo
- 17. cron di quarzo - cosa succede se il giorno del mese non esiste?
- 18. Cosa succede alla memoria che non viene liberata dopo la fine del programma?
- 19. PHP: append di valutare se la chiave esiste già, se non aggiungere la chiave
- 20. C++ 11 auto: cosa succede se ottiene un riferimento costante?
- 21. Chiave del dizionario nascosta
- 22. Convertire il dizionario <String,Int> nel dizionario <String, SomeEnum> utilizzando LINQ?
- 23. Cosa succede se un costruttore di shared_ptr non riesce?
- 24. Haskell - Implementare Monoid cosa succede se l'operatore non è associativo
- 25. Esiste un equivalente Java alla parola chiave 'checked' di C#?
- 26. Cosa succede se il pacchetto dell'app non contiene una chiave per la "chiave loc" ricevuta nella notifica push?
- 27. Cosa succede se non chiudi un filehandle in Perl?
- 28. Se la chiave non esiste creare il valore predefinito
- 29. Cosa succede se un costruttore lancia un'eccezione?
- 30. Cosa succede se voglio memorizzare un valore None nel memcache?
@JonSkeet Non è TryGetValue che esegue anche una doppia ricerca ([come indicato nel corpo di questa domanda] (http://stackoverflow.com/questions/1413304/net-adding-dictionary-item-check-if-it-exists- o-lasciare-eccezione))? – nawfal
@nawfal: Non vedo alcuna indicazione che quella domanda lo affermi affatto. Dice che sta facendo più lavoro di 'ContainsKey', che è vero, perché deve estrarre anche il valore. Comunque non sta facendo due ricerche. –
Ingenuamente, ho continuato a prevedere nulla, ma per Dizionario, restituisce l'equivalente "0" nell'enumerazione. –
Jess