2010-01-18 17 views
8

¿Cómo pruebo un objeto de diccionario genérico para ver si está vacío? Quiero correr un cierto código de la siguiente manera:¿Cómo hacer una prueba para una colección generic.dictionary vacía?

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

El objeto reportGraph es de tipo System.Collections.Generic.Dictionary Cuando se ejecuta este código, a continuación el diccionario reportGraphs está vacío y MoveNext() lanza inmediatamente una NullReferenceException. No quiero poner un try-catch alrededor del bloque si hay una forma más eficaz de manejar la colección vacía.

Gracias.

+2

¿Estás seguro de que 'reportGraphs' en sí mismo no es' nulo'? – dtb

+2

'System.Collections.Generic.Dictionary' no * tiene * un método' MoveNext() '. ¿Estás seguro de que no estás pensando en un iterador sobre un Diccionario? –

+0

Lo siento, reportGraphs en realidad se define como .Enumerator, como en reportGraphs = new System.Collections.Generic.Dictionary .Enumerator(); Entonces, cualquier forma de detectar que MoveNext() generará una excepción cuando se aplique al Enumerador. Si trato de buscar nulo me sale El operador '! =' No se puede aplicar a los operandos del tipo 'System.Collections.Generic.Dictionary .Enumerator' y '' – DEH

Respuesta

12

Si se trata de un diccionario genérico, simplemente puede marcar Dictionary.Count. Count será 0 si está vacío.

Sin embargo, en su caso, reportGraphs parece que es IEnumerator<T> - ¿hay alguna razón para que enumere su colección a mano?

+0

Tiene razón; de hecho es un enumerador, lo siento. No hay una razón fuerte, es solo la forma en que se ha estructurado el modelo de objetos dentro de la aplicación; cambiarlo requeriría bastante trabajo ... – DEH

+1

Por lo general, es un enfoque mucho mejor no trabajar con IEnumerator directamente: use un bucle foreach en su lugar , ya que normalmente evitará este escenario exacto ... –

6

Hay una diferencia entre un diccionario empty y null. Llamar al MoveNext en una colección vacía no dará como resultado un NullReferenceException. Supongo que en su caso podría probar si reportGraphs != null.

+0

reportGraphs se parece más a un enumerador que un diccionario sin embargo. ¿Por qué debería un diccionario devolver un enumerador 'null'? Me preguntaba ... – dtb

+0

@dtb buen punto. Debe ser un 'IEnumerable '. –

+0

Pero 'Dictionary ' implementa 'IEnumerable >', ¿no es así? Creo que es de donde proviene la propiedad 'Value'. – Groo

3

Como dijo Darin, reportGraphs es null si arroja un NullReferenceException. La mejor manera sería asegurarse de que nunca sea nula (es decir, asegúrese de que esté inicializada en el constructor de su clase).

Otra manera de hacer esto (para evitar la enumeración explícita) sería el uso de una declaración foreach:

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

[Editar] Tenga en cuenta que este ejemplo supone, además, que nunca es reportGraphsnull.

+0

Esto arrojará NullReferenceException si reportGraphs es nulo. –

+0

Correcto, * la mejor manera sería asegurarse de que nunca sea nulo *. – Groo

Cuestiones relacionadas