2017-12-23 17 views
-3

좋아요, 그래서 나는이 질문에 대한 저자의 질문에 이렇게 답하는 것을 허락하지 않았습니다. Sergey (잘못 입력하면 죄송합니다)가 이것을 보았습니다. 나는 8 Label 컨트롤을 동적으로 만들어지고 있고 나는 코드를 사용하는 경우 그 제공 : 그것을 만든 8 개 레이블 (5)를 제거합니다한계가 있습니까?

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

. 모두 동일한 태그를 사용합니다. 나는 그것이 작동 할 때마다 동일한 코드를 3 번 ​​실행해야하고, 실행될 때마다 제거되는 양은 줄어 듭니다. 이 질문에 대해 매우 유감스럽게 생각합니다.

+0

아니요, 제한이 없습니다 (이유 있음). 높은 범위의 업데이트를 받기 시작할 때만 성능에 영향을줍니다. – FrankerZ

+0

에는 제한 사항이 무엇입니까? 너의 8 개 라벨? – Jonesopolis

+1

당신이 무엇을 요구하고 있는지 분명하지 않습니다. 의미있는 제목과 본문에 약간의 노력을 기울이십시오. – MickyD

답변

1

먼저 다른 작성자의 질문을 반복 할 때 원래 게시물을 연결하는 것이 도움이되는 경우가 많습니다. 그리고 게시물뿐만 아니라 제목에 질문을 넣어.

foreach가 반복 할 수있는 횟수에는 제한이 없습니다. 문제는 각 반복마다 목록의 값 수를 변경한다는 것이므로 값을 제거 할 때마다 완료 임계 값이 감소합니다 ("foreach"루프는 잘 포장 된 "for"루프임을 기억하십시오.).

이 문제에 대한이 개 쉬운 솔루션이 있습니다

해결 방법 1 - 사용자 (이가 당신을 필요로 "for"루프보다 전통적인 -

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

해결 방법 2을 반복하는 임시 복사본을 만듭니다 감소하지만)

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--; 
     } 
    } 

임 당신이는 IEnumerable을 수정하려고에 대한 System.InvalidOperationException를 받고되지 않습니다 실제로 놀랐다.

+0

좋아, 그래, 미안 해요, 나는 게시와 함께 빨려하고 종종 Stackoverflow를 사용하지 않으려 고합니다. 고맙습니다. 죄송합니다. –

+0

해결책 2가 유효하지 않습니다. 'OfType '은'IEnumerable '을 반환합니다. 즉, 'Count' ** 속성 ** 및 B. 인덱서가 없음을 의미합니다. 당신이 가지고있는 것과 일치시키기 위해서, 당신은'Count()'와'ElementAt (int)'로 대체해야합니다. 그러면 전체 컬렉션을 반복적으로 반복해야합니다. 'OfType