2009-04-10 14 views
5

Gestern habe ich einen Code geschrieben, um alle Steuerelemente in einem Formular zu entfernen, das bestimmte Kriterien erfüllt. Naiv zu schreiben, das ist es, was mir einfällt.Entfernen von Steuerelementen in einer Schleife

for (int i = 0; i < this.Controls.Count; ++i) 
{ 
    if (this.Controls[i].Name.Length == 2) 
    { 
     this.Controls.Remove(this.Controls[i); 
    } 
} 

Aber es ist so, dass der Code falsch ist. Ich ändere es dann zu:

foreach (Control ctr in this.pbBoardImage.Controls) 
{ 
    if (ctr.Length == 2) 
    { 
     this.Controls.Remove(ctr); 
    } 
} 

Aber es war immer noch nicht korrekt. Ich weiß, dass der richtige Weg wäre:

for (int i = this.Controls.Count - 1; i >= 0; i--) 
{ 
    if (this.Controls[i].Name.Length == 2) 
    { 
     this.Controls.Remove(this.Controls[i]); 
    } 
} 

jedoch noch nicht elegant fühlt. Ich konnte List.RemoveAll nicht verwenden, da this.Controls keine List war. Also kann ich nach einem eleganteren Weg fragen, vorzugsweise ohne eine Schleife zu benutzen?

Antwort

13

Nicht sicher, warum Sie diese Antwort nicht mochte ... Ich habe die wichtige RemoveAt hervorgehoben; jedoch als Alternative in .NET 3.5/C# 3.0: LINQ:

 var qry = from Control control in Controls 
        where control.Name.Length == 2 
        select control; 

     foreach(var control in qry.ToList()) { 
      Controls.Remove(control); 
     } 

(original)

Sie können nicht Remove innerhalb foreach - es den Iterator bricht. Ein gemeinsamer Ansatz hier ist rückwärts iterieren:

for (int i = this.Controls.Count - 1; i >= 0; i--) { 
    if (this.Controls[i].Name.Length == 2) { 
     this.Controls.RemoveAt(i); // <=========== *** RemoveAt 
    } 
} 

Dies ist die Fragen „durch ein off“ vermeidet usw.

+0

Scheint wie eine gute Antwort für mich. Ich habe es aufgewertet. –

+0

Es war nicht ich, aber es ist die richtige Antwort, also +1! –

Verwandte Themen