2017-12-23 3 views
-3

Okay, also durfte ich den Beitrag, den ich gefunden habe, nicht kommentieren, um den Autor der Frage zu fragen, damit hoffentlich Sergey (Sorry, wenn ich falsch geschrieben habe) dies sieht. Ich habe 8 Label-Steuerelemente dynamisch gemacht werden und wenn ich den Code verwenden, sofern er:Gibt es ein Limit dafür?

  foreach (Label lbl in Controls.OfType<Label>()) 
     { 
      if (lbl.Tag.ToString() == "Mass") 
      { 
       Controls.Remove(lbl); 
      } 
     } 

es 5 der 8 Etiketten erstellt entfernen. Alle haben das gleiche Tag. Ich muss den gleichen Code 3 Mal ausführen, damit es funktioniert und jedes Mal, wenn es läuft, verringert sich die Menge entfernt. Tut mir sehr leid, dass ich das als Frage gestellt habe.

+0

Nein, es gibt kein Limit (innerhalb des Grundes), nur die Auswirkungen auf die Leistung, wenn Sie beginnen, in hohe Bereiche von Updates zu gelangen. – FrankerZ

+0

gibt es eine Grenze für was? Deine 8 Etiketten? – Jonesopolis

+1

Unklar was Sie fragen. Bitte geben Sie etwas Aufwand in einen sinnvollen Titel und Körper – MickyD

Antwort

1

Zunächst einmal, wenn eine Frage von einem anderen Autor wiederholt wird, ist es oft hilfreich, den ursprünglichen Beitrag zu verknüpfen. Und stelle die Frage sowohl in die Post als auch in den Titel.

Es gibt keine Begrenzung für die Häufigkeit, mit der eine Foreach iterieren kann. Das Problem ist, dass Sie die Anzahl der Werte in der Liste mit jeder Iteration ändern, so dass jedes Mal, wenn Sie einen Wert entfernen, der Schwellenwert für die Fertigstellung abnimmt (Denken Sie daran, dass eine "foreach" -Schleife nur eine gut gepackte "for" -Schleife ist)).

Es gibt zwei einfache Lösungen für dieses Problem:

Lösung 1 - Erstellen Sie eine temporäre Kopie durch

foreach (Label lbl in Controls.OfType<Label>().ToList()) 
    { 
     if (lbl.Tag.ToString() == "Mass") 
     { 
      Controls.Remove(lbl); 
     } 
    } 

Lösung 2 iterieren - Benutzer eine traditionellere „für“ Schleife (Dies erfordert, dass Sie jedoch Abnahme)

for(int i = 0; i < Controls.OfType<Label>().Count; i++) 
    { 
     Label lbl = Controls.OfType<Label>()[i]; 
     if (lbl.Tag.ToString() == "Mass") 
     { 
      Controls.Remove(lbl); 
      i--; 
     } 
    } 

Im eigentlich überrascht, dass Sie keine System.InvalidOperationException bekommen für den Versuch, eine IEnumerable zu ändern.

+0

In Ordnung, ja Entschuldigung, ich sauge mit Postings und versuche nicht Stackoverflow zu verwenden, die oft verursachen, yeah. Vielen Dank und noch einmal, tut mir leid –

+0

Lösung 2 ist ungültig. 'OfType ' gibt einen 'IEnumerable ' zurück, was bedeutet, dass es A. Keine 'Count' ** Eigenschaft ** und B. Kein Indexer gibt. Um dem zu entsprechen, was Sie haben, müssten Sie durch "Count()" und "ElementAt (int)" ersetzen, die dann die gesamte Sammlung wiederholen müssten. Sie können beides beheben, indem Sie das Ergebnis von OfType

Verwandte Themen