2010-05-04 14 views
5

Si ingreso el siguiente código, aparece un error. Básicamente, el foreach se romperá cuando se encuentre con un Control que no es una etiqueta.¿Puedo usar foreach para devolver solo un cierto tipo de una colección?

foreach (Label currControl in this.Controls()) { 

... 
} 

Tengo que hacer algo como esto.

foreach (Control currControl in this.Controls()) { 
    if(typeof(Label).Equals(currControl.GetType())){ 

    ... 
    } 

} 

puede alguien pensar en una mejor manera de hacerlo sin mí necesidad de comprobar el tipo? ¿Puedo de alguna manera obtener foreach para omitir los objetos que no son etiquetas?

+0

¿Estás en .NET 3.5? ¿Puedes usar LINQ? – Strelok

Respuesta

10

Si estás en .NET 3.5 o más reciente, puede hacer algo como esto

foreach(var label in this.Controls().OfType<Label>()) { 
} 

OfType<T> hará caso de tipos que no se puede convertir a T. Ver http://msdn.microsoft.com/en-us/library/bb360913.aspx

+0

genial ¡Lo acabo de descubrir! ¿Alguna idea de cómo lo haría sin 3.5? – Diskdrive

+0

Sintaxis linda: Esto me tiene preguntando si puedo hacer esto en Java 6 ... –

6

Brian ha dado la mayor respuesta apropiada en términos de OfType. Sin embargo, quería señalar que hay una forma mejor de verificar los tipos en los casos en que haga. En lugar de su código actual:

if(typeof(Label).Equals(currControl.GetType())){ 

... 
} 

que puede utilizar:

if (currControl is Label) 
{ 
    Label label = (Label) currControl; 
    // ... 
} 

o:

Label label = currControl as Label; 
if (label != null) 
{ 
    // ... 
} 

Tenga en cuenta que estas dos alternativas se también incluir subclases de Label, que a su el código original no.

+0

gracias lo tendré en cuenta – Diskdrive

Cuestiones relacionadas