2017-12-23 12 views
-3

さて、私は質問の著者に頼んで見つけた投稿にコメントすることは許されませんでした。これはうまくいけばセルゲイ(私が間違っていれば申し訳ありません)がこれを見ています。これには制限がありますか?

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

それが作成された8つのラベルの5を削除します:私は、動的に作られていると私は彼が提供されたコードを使用するときに8つのLabelコントロールを持っています。すべて同じタグを持っています。私はそれが動作するように同じコードを3回実行する必要がありますし、実行するたびに削除量が減少します。これを質問すると非常に残念です。

+0

いいえ、上限はありません(理由の範囲内)。更新の範囲が広がると、パフォーマンスにのみ影響します。 – FrankerZ

+0

には何の制限がありますか?あなたの8つのラベル? – Jonesopolis

+1

あなたが何を求めているのか不明です。意味のあるタイトルと本文に少し努力してください – MickyD

答えて

1

最初に、別の著者からの質問を繰り返すと、元の投稿をリンクすると役立つことがよくあります。そして、タイトルとタイトルの両方に質問を入れてください。

foreachが反復できる回数に制限はありません。問題は、各反復でリストの値の数を変更しているため、値を削除するたびに完了のしきい値が低下することです(「foreach」ループはうまくパッケージ化されたforループです)。

この問題の2つの簡単な解決策があります。

ソリューション1 - ループ「は、」ユーザーより伝統的な(これはする必要があります -

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

ソリューション2を反復処理するために一時的なコピーを作成しますが、あなたがIEnumerableをを変更しようとするためのSystem.InvalidOperationExceptionを取得されていません実際に驚いデクリメントしかし)

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

イム。

+0

申し訳ありません、申し訳ありませんが、私は投稿と吸うとStackoverflowを使用しないでください、しばしば、ええ原因。ありがとう、もう一度、申し訳ありません –

+0

ソリューション2が無効です。 'OfType 'は、IEnumerable を返します。これは、Aがないことを意味します。「Count」**プロパティ**およびB.インデクサーなし。あなたが持っているものと一致させるためには、 'Count()'と 'ElementAt(int)'と置き換えなければならず、コレクション全体を繰り返し反復する必要があります。 'OfType

関連する問題