2010-05-04 6 views
5

Se inserisco il codice qui sotto, ottengo un errore. Fondamentalmente, il foreach si interromperà quando incontra un Control che non è un'etichetta.Posso usare foreach per restituire solo un determinato tipo da una raccolta?

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

... 
} 

Devo fare qualcosa del genere.

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

    ... 
    } 

} 

qualcuno può pensare a un modo migliore di farlo senza che sia necessario controllare il tipo? Posso in qualche modo ottenere foreach per saltare gli oggetti che non sono etichette?

+0

Sei su .NET 3.5? Puoi usare LINQ? – Strelok

risposta

10

Se siete su .NET 3.5 o più recente, si può fare qualcosa di simile

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

OfType<T> ignorerà tipi che non possono essere espressi a T. Vedere http://msdn.microsoft.com/en-us/library/bb360913.aspx

+0

cool, l'ho appena capito! qualche idea di come faresti senza 3.5? – Diskdrive

+0

Sintassi carina: questo mi chiede se posso farlo in Java 6 ... –

6

Brian ha dato il massimo risposta appropriata in termini di OfType. Tuttavia, volevo sottolineare che esiste un modo migliore di verificare i tipi nei casi in cui è necessario eseguire . Invece del codice corrente:

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

... 
} 

È possibile utilizzare:

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

o:

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

nota che entrambe queste alternative saranno anche includere sottoclassi di Label, che il vostro il codice originale no.

+0

grazie a questo lo terrò a mente – Diskdrive

Problemi correlati