Aggiunta di elementi non distinti a un dizionario

-1

Suggerimenti su un buon pattern da seguire per aggiungere elementi a un dizionario in cui si desidera aggiungere un elemento se non esiste, altrimenti non fare nulla

I 2 approcci a cui riesco a pensare sono

if(!dict.CcontainsKey(i))
    dict.Add(i,true);

E

try
{
    dict.Add(i,true);
}
catch (ArgumentException e)
{
//Do Nothing
}

Nel caso in cui ci si aspetta che le ripetizioni siano minime, il secondo metodo è preferito?

    
posta user87166 07.12.2014 - 11:55
fonte

4 risposte

6

Non dovresti usare eccezioni per il controllo del flusso. Oltre a ciò, la tua prima versione è più breve, più comprensibile, più ovviamente corretta (non devo controllare i documenti che ArgumentException sia il giusto tipo di eccezione) e molto probabilmente più efficiente.

A causa di tutto ciò, la prima versione è una scelta molto migliore.

    
risposta data 07.12.2014 - 18:14
fonte
2

Dal mio punto di vista, andrei sempre al primo approccio: è leggibile, non contiene il brutto blocco try-catch e contiene chiaramente l'intento. Sei sicuro che dovrebbe essere un'eccezione quando aggiungi e non riesci? Peggio ancora, non fai niente in quel caso. Non sono sicuro che sia l'intento del codice. Il primo sembra anche più la logica desiderata.

    
risposta data 07.12.2014 - 12:38
fonte
1

Dipende da come vuoi che il tuo codice reagisca.

Se vuoi semplicemente fare "niente", preferirei il primo modo, hai suggerito. È semplice e pulito.

L'eccezione potrebbe essere utile, se non ti aspetti alcun elemento duplicato, ma all'improvviso lo sono. È possibile gestire quell'eccezione nel catch-block, ad esempio, dire all'utente, che tale elemento esiste già o "ripensarlo" al chiamante. Andando in questo modo, abiliti qualcun altro a reagire, se viene rilevato un elemento duplicato.

    
risposta data 07.12.2014 - 12:46
fonte
1

Come sottolineato da @svick, non si dovrebbero usare eccezioni per il controllo del flusso.

L'approccio n. 2 ha anche introdotto un potenziale bug nel codice, o almeno un comportamento che non hai previsto (entrambi sono sinonimi per me).

Il fatto è che il tentativo di duplicare una chiave non è l'unico caso in cui Dictionary genererebbe un ArgumentException . Un altro sta tentando di aggiungere null a Dictionary (nel qual caso viene lanciata una ArgumentNullException , ma è una sottoclasse di ArgumentException , quindi sarà ancora gestita dalla tua clausola catch ).

I dizionari in C # non accettano null come chiavi. Se i è nullo, allora abbiamo alcune informazioni che non possono essere mantenute in dict , e potrebbe indicare che c'è qualcosa di sbagliato altrove nel tuo codice. Ma questo pezzo di codice che hai postato trascura questo importante segnale di avvertimento, rendendo più difficile identificare la causa principale del bug in futuro.

Questa è un'altra ragione per non fare affidamento sulle eccezioni quando non ne hai bisogno, specialmente non fare affidamento su di esse nel modo in cui il codice può ignorarle ...

E infine, ti suggerirei di utilizzare il terzo approccio:

dict[i] = true;

Sicuramente il più pulito. Lo sapresti se dai un'occhiata a la documentazione .

Controllare la documentazione è il modo migliore per evitare di reinventare la ruota. Non hai bisogno di inventare il tuo "modello", è già lì per te.

(Con questa soluzione presumo che il tuo codice non debba mai riportare alcun valore su false - i frammenti che hai postato non lo implicano).

    
risposta data 07.12.2014 - 23:17
fonte

Leggi altre domande sui tag