こんにちは!
タブコントロールの各タブページに11個のパネルがあり、10個のパネルを削除したいと考えています。私はこのコードを書いた:
コントロールの削除プログラム的に期待どおりに機能しません!
var PnlsToRemove = tabControl.SelectedTab.Controls.OfType<Panel>()
.Where(p => !p.Name.StartsWith("BasePanel"));
foreach (var pnl in PnlsToRemove)
pnl.Dispose();
をしかしトレースした後、私はそれは順序が交互で取り除くと思いました!
は、上記のコードを実行するとパネル0,2,4,6,8,10だけが削除され、残りのパネルは残ることを意味します。
ので、私はこのような交互パネルを除去するために、ループ内で自分のコードを置くべきである:()は、すべてのパネルを除去するために4回ループしながら、この場合
while (tabControl.SelectedTab.Controls.OfType<Panel>().Count() != 1)
{
var PnlsToRemove = tabControl.SelectedTab.Controls.OfType<Panel>()
.Where(p => !p.Name.StartsWith("BasePanel"));
foreach (var pnl in PnlsToRemove)
pnl.Dispose();
}
(10枚のパネル用)。
注意:私のパネルはすべて「PnlsToRemove」に存在し、このバグはforeachの「PnlsToRemove」の実行時に発生します。
私のコードには何が問題なのですか?
なぜforeach()が次のパネルからジャンプするのですか?
私はすべてが明らかだと思います!
あなたのアドバイスに従って.ToList()を使用しました。それはうまくいった。しかし、私は不安を払わなかったし、何が問題だったのだろうか? は、なぜ「リストからパネルを削除すると突然変異しているのですか」という意味ですか? –
mahdiahmadirad
多くのLINQメソッドはレイジー評価をもたらします。つまり、基になる列挙体のコピーを作成しない場合は作成しません。 あなたは配列を持っているとし、それをコピーする代わりに単にインデックスを覚えておいてください。 "次の要素を取得する"操作は、インデックスをインクリメントし、配列から次の値を返します。要素ゼロから始めます。それが返され、インデックスが1に更新されます。しかし、今では配列から要素ゼロを取り除いているので、現在インデックス1はインデックス2だったものです。ありがとうございます。 –
ありがとうございます。私は理解した。 – mahdiahmadirad