Sto utilizzando un dizionario per eseguire ricerche per un programma su cui sto lavorando. Eseguo un mazzo di chiavi attraverso il dizionario, e mi aspetto che alcune chiavi non abbiano un valore. Prendo lo KeyNotFoundException
esattamente dove si trova e lo assorbo. Tutte le altre eccezioni si propagheranno verso l'alto. È questo il modo migliore per gestirlo? O dovrei usare una ricerca diversa? Il dizionario usa un int come chiave e una classe personalizzata come valore.Il modo migliore per gestire un KeyNotFoundException
risposta
Uso Dictionary.TryGetValue
invece:
Dictionary<int,string> dictionary = new Dictionary<int,string>();
int key = 0;
dictionary[key] = "Yes";
string value;
if (dictionary.TryGetValue(key, out value))
{
Console.WriteLine("Fetched value: {0}", value);
}
else
{
Console.WriteLine("No such key: {0}", key);
}
Provare a utilizzare: Dict.ContainsKey
Edit:
Prestazione saggia penso Dictionary.TryGetValue
è meglio come alcuni altri hanno suggerito, ma non mi piace usare quando ho non devo quindi a mio parere ContainsKey è più leggibile ma richiede più righe di codice se è necessario anche il valore.
Perché ha ottenuto un downvote? per favore spiega così posso migliorare la risposta. – Peter
Puoi spiegare perché non ti piace usare 'out' a meno che non sia necessario? –
@wilbishardis è solo un'abitudine, secondo me penso che sia più difficile che un parametro di metodo possa essere modificato molto più chiaramente quando si ha un segno =. ora questa è solo la mia opinione e questo non significa che tutti si sentano uguali, e in alcuni casi la sua migliore opzione 'int.TryParse' è un esempio .. – Peter
si dovrebbe utilizzare il 'ContainsKey (tasto string)' il metodo del dizionario per verificare se una chiave esiste. utilizzando le eccezioni per il normale flusso di programma non è considerato una buona pratica.
Esattamente perché ho fatto questa domanda, sentivo che quello che stavo facendo non era una buona pratica. –
Qui è un elegante, una soluzione linea (Tenete a mente questo rende la ricerca per due volte. Vedi sotto per la versione TryGetValue di questo che dovrebbe essere utilizzato in cicli di lunga durata.)
string value = dictionary.ContainsKey(key) ? dictionary[key] : "default";
Eppure mi trovo a doverlo fare ogni volta che accedo a un dizionario. Io preferirei che tornare nulla così posso solo scrivere:
string value = dictionary[key] ?? "default";//this doesn't work
Evitare l'uso di questa soluzione in quanto richiede due ricerche sul dizionario. Una ricerca per 'dictionary.ContainsKey' e un'altra per' dictionary [key] '. Usa la risposta di @ JernejNovak per prestazioni migliori. – FrankerZ
A volte le prestazioni non sono una priorità e la leggibilità è più importante. La risposta di Jon Skeet non è qualcosa che vuoi sparsi per tutto il tuo codice. Direi di evitarlo a grandi giri. Prenderò un appunto nella mia risposta. Non vale davvero il downvote però. –
Com'è 'string value = dictionary.ContainsKey (chiave)? dictionary [key]: "default"; 'più leggibile di' string value = dictionary.TryGetValue (chiave, valore out)? valore: "Nessuna chiave!"; ' – FrankerZ
Una soluzione line utilizzando TryGetValue
string value = dictionary.TryGetValue(key, out value) ? value : "No key!";
essere consapevoli del fatto che valore variabile deve essere di tipo il dizionario rendimenti in questo caso stringa. Qui non è possibile utilizzare var per la dichiarazione delle variabili.
- 1. Il modo migliore per gestire l'unione JPA?
- 2. Il modo migliore per gestire l'intervallo di 360 gradi
- 3. Magento - Il modo migliore per gestire i moduli in blocchi?
- 4. Il modo migliore per gestire molti pacchetti in entrata
- 5. il modo migliore per gestire pyd/pdb flakiness re/stdout?
- 6. Il modo migliore per gestire più costruttori in Java
- 7. Qual è il modo migliore per gestire più azioni?
- 8. Il modo migliore per gestire snippet di codice in Linux?
- 9. Il modo migliore per gestire i messaggi di errore
- 10. Il modo migliore per gestire più connessioni NSURL
- 11. Il modo migliore per gestire le dipendenze di Android Gradle
- 12. Il modo migliore per gestire javascript all'interno dei controlli personalizzati?
- 13. Il modo migliore per gestire l'overflow integer in C#?
- 14. Il modo migliore per gestire le modifiche del database
- 15. Esiste un modo migliore per gestire le stringhe localizzate?
- 16. Un modo migliore per gestire NullReferenceExceptions in C#
- 17. c'è un modo migliore per gestire index.html con Tornado?
- 18. Il modo migliore per spostare un __m128i?
- 19. Il modo migliore per simulare un dominio?
- 20. modo migliore per gestire i dati degli attributi in Slim
- 21. modo migliore per gestire le eccezioni Java in ServletContextListener
- 22. Qual è il modo migliore per gestire un albero delle dipendenze in .NET?
- 23. Il modo migliore per gestire le proprietà nulle su un parametro del metodo
- 24. Il modo (quasi) migliore per gestire un elenco con elementi in movimento
- 25. Il modo migliore per gestire le date in un MVC ASP.NET - Applicazione Javascript
- 26. Qual è il modo migliore per gestire un errore di recupero in caso di risposta rapida?
- 27. Il modo migliore per gestire un pool di risorse in Clojure
- 28. Il modo migliore per riorganizzare un ArrayList in Java
- 29. Il modo migliore per identificare un utente in modo univoco
- 30. Qual è il modo migliore per gestire il processo unix da java?
bella risposta grazie –
È ancora consigliato questo invece di ContainsKey()? –
@ SvenB: Sì, direi così. Perché la ricerca due volte, una volta per verificare l'esistenza della chiave e poi una volta per ottenere il valore, quando è possibile eseguirli entrambi contemporaneamente? –