2010-01-18 10 views
8

Come si verifica un oggetto dizionario generico per vedere se è vuoto? Voglio correre un po 'di codice come segue:Come testare una raccolta generica di generic.dictionary?

while (reportGraphs.MoveNext()) 
{ 
    reportGraph = (ReportGraph)reportGraphs.Current.Value; 
    report.ContainsGraphs = true; 
    break; 
} 

L'oggetto reportGraph è di tipo System.Collections.Generic.Dictionary Quando si esegue questo codice, allora il dizionario reportGraphs è vuota e MoveNext() genera immediatamente un NullReferenceException. Non voglio mettere un try-catch attorno al blocco se c'è un modo più performante di gestire la raccolta vuota.

Grazie.

+2

Sei sicuro che 'reportGraphs' stesso non sia' null'? – dtb

+2

'System.Collections.Generic.Dictionary' non ha * un metodo' MoveNext() '. Sei sicuro di non pensare a un iteratore su un dizionario? –

+0

Molto dispiaciuto, reportGraphs è effettivamente definito come .Enumerator, come in reportGraphs = new System.Collections.Generic.Dictionary .Enumerator(); Quindi, qualsiasi modo per rilevare che MoveNext() genererà un'eccezione quando viene applicata all'Enumeratore. Se provo a verificare la presenza di null, ottengo l'operatore "! =" Non può essere applicato agli operandi di tipo "System.Collections.Generic.Dictionary .Enumerator" e "" – DEH

risposta

12

Se si tratta di un dizionario generico, è sufficiente controllare lo Dictionary.Count. Il conteggio sarà 0 se è vuoto.

Tuttavia, nel tuo caso, reportGraphs sembra che sia un IEnumerator<T> - c'è un motivo per il tuo enumerazione della tua collezione a mano?

+0

Hai ragione - è davvero un enumeratore - mi dispiace. Non c'è una ragione valida, è solo il modo in cui è stato strutturato il modello di oggetto all'interno dell'app - cambiarlo richiederebbe un bel po 'di lavoro ... – DEH

+1

Di solito è un approccio molto migliore per non lavorare direttamente con IEnumerator - usa invece un ciclo foreach , poiché in genere impedirà questo scenario esatto ... –

6

C'è una differenza tra un dizionario empty e null. Chiamando MoveNext su una raccolta vuota non si otterrà un NullReferenceException. Immagino che nel tuo caso potresti provare se reportGraphs != null.

+0

reportGraphs sembra più simile un enumeratore di un dizionario però. Perché un dizionario dovrebbe restituire un enumeratore 'null'? Mi chiedo solo ... – dtb

+0

@dtb buon punto. Deve essere un 'IEnumerable '. –

+0

Ma 'Dictionary ' implementa 'IEnumerable >' no? Credo che sia da qui che proviene la proprietà 'Value'. – Groo

3

Come ha detto Darin, reportGraphs è null se lancia un NullReferenceException. Il modo migliore sarebbe assicurarsi che non sia mai nullo (ad esempio, assicurarsi che sia inizializzato nel costruttore della classe).

Un altro modo per fare questo (per evitare l'enumerazione esplicitamente) sarebbe quella di utilizzare una dichiarazione foreach:

foreach (KeyValuePair<Key,Value> item in reportGraphs) 
{ 
    // do something 
} 

[Edit] Si noti che questo esempio presuppone anche che non è mai reportGraphsnull.

+0

Questo genererà NullReferenceException se reportGraphs è nullo. –

+0

corretto, * il modo migliore sarebbe assicurarsi che non sia mai nullo *. – Groo