2010-05-04 3 views
5

Wenn ich den folgenden Code eingeben, erhalte ich einen Fehler. Grundsätzlich wird die Foreach unterbrochen, wenn sie auf ein Control trifft, das kein Label ist.Kann ich foreach verwenden, um nur einen bestimmten Typ aus einer Sammlung zurückzugeben?

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

... 
} 

Ich muss so etwas tun.

kann mir jemand einen besseren Weg vorstellen, ohne dass ich den Typ überprüfen muss? Kann ich irgendwie die Objekte überspringen, die keine Labels sind?

+0

Sind Sie auf .NET 3.5? Können Sie LINQ verwenden? – Strelok

Antwort

10

Wenn Sie auf .NET 3.5 oder höher, können Sie so etwas wie dieses

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

OfType<T> tun Typen ignorieren, die nicht zu T. Siehe gegossen werden kann http://msdn.microsoft.com/en-us/library/bb360913.aspx

+0

cool ich habe es gerade herausgefunden! eine Idee, wie Sie es ohne 3,5 tun würden? – Diskdrive

+0

Nette Syntax: Das hat mich gefragt, ob ich das in Java 6 tun kann ... –

6

Brian am meisten gegeben hat entsprechende Antwort in Bezug auf OfType. Ich möchte jedoch darauf hinweisen, dass es eine bessere Möglichkeit gibt, nach Typen in Fällen zu suchen, in denen Sie dies tun müssen. Statt des aktuellen Code:

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

... 
} 

können Sie verwenden:

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

oder:

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

Beachten Sie, dass diese beiden Alternativen auch sind Subklassen von Label, die Ihre Originalcode nicht.

+0

Dank wird dies im Hinterkopf behalten – Diskdrive

Verwandte Themen