2009-04-10 38 views
5

Hôm qua tôi đã viết một đoạn mã để xóa tất cả các điều khiển trong một biểu mẫu đáp ứng các tiêu chí nhất định. Viết nó ngây thơ, đây là những gì tôi nghĩ ra.Xóa điều khiển trong vòng lặp

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

Nhưng điều đó xảy ra là mã sai. Sau đó, tôi đổi thành:

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

Nhưng vẫn không đúng. Tôi biết rằng cách chính xác sẽ là:

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

Tuy nhiên nó vẫn không cảm thấy thanh lịch. Tôi không thể sử dụng List.RemoveAll, vì this.Controls không phải là một List. Vì vậy, tôi có thể yêu cầu một cách thanh lịch hơn, tốt hơn là không sử dụng một vòng lặp?

Trả lời

13

Không chắc chắn lý do bạn không thích câu trả lời này ... Tôi đã đánh dấu quan trọng RemoveAt; Tuy nhiên, như một sự thay thế trong 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); 
     } 

(bản gốc)

Bạn không thể Remove trong foreach - nó phá vỡ các iterator. Một cách tiếp cận phổ biến ở đây là để lặp ngược:

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

Điều này tránh sự "tắt bởi một" vấn đề vv

+0

Có vẻ như một câu trả lời tốt với tôi. Tôi upvoted nó. –

+0

Đó không phải là tôi, nhưng đó là câu trả lời đúng, vì vậy +1! –

Các vấn đề liên quan