2009-04-10 5 views
5

어제 특정 기준을 충족하는 폼의 모든 컨트롤을 제거하는 코드를 작성했습니다. 그것을 순진하게 쓰는 것은 내가 생각해내는 것입니다.루프에서 컨트롤 제거

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

하지만 코드가 잘못되었습니다. 그런 다음 변경 :

그러나 여전히 올바르지 않습니다. 내가 올바른 방법이 될 것이라고 알고

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

그러나 여전히 우아한 생각하지 않습니다. List.RemoveAll을 사용할 수 없습니다.이 컨트롤은 List가 아니기 때문에 사용할 수 없습니다. 루프를 사용하지 않고보다 우아한 방법을 요구할 수 있습니까?

답변

13

왜이 답변이 마음에 들지 않았는지 잘 모르겠다. 중요한 내용을 강조했습니다. RemoveAt; 그러나, .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); 
     } 

(원본)

당신하지 Removeforeach 내에서 할 수있는 -는 반복자를 나누기. 여기에 일반적인 접근 방식은 뒤로을 반복하는 것입니다

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

이는 "해제 하나"문제 방지 등

+0

나에게 좋은 답변처럼 보인다. 나는 그것을 upvoted. –

+0

그것은 나이 아니었지만 정답입니다. 그래서 +1! –

관련 문제