私はlinqクエリを持っています。その結果はforeachループで繰り返されます。foreachとlinq query - わかりやすいヘルプが必要です
最初は、私は、コレクションにわたって反復し、従ってtableLayoutPanelからコントロールを削除し、テーブルレイアウトパネルからコントロールのコレクションをつかむクエリである:上記
var AllItems = (from Item in this.tableLayoutPanel1.Controls.OfType<ItemControl>()
select Item);
foreach (ItemControl item in AllItems)
{
Trace.WriteLine("Removing " + item.ToString());
this.tableLayoutPanel1.Controls.Remove(item);
item.Dispose();
}
Iとして行いません(つまり、エラーをスローする)、コントロールの半分(ODD番号のもの)を削除します 各繰り返しでAllItemsが自己を減らし、元のコレクションが変更されていてもエラーはスローされません。
私は文字列の配列でsimmilarない場合:
string[] strs = { "d", "c", "A", "b" };
List<string> stringList = strs.ToList();
var allitems = from letter in stringList
select letter;
foreach (string let in allitems)
{
stringList.Remove(let);
}
今回のVisual Studioは、基になるコレクションが変更されたことを訴えて(予想通り)エラーがスローされます。
なぜ最初の例もあまりにも吹き飛ばされませんか?
私はここで理解していないですし、誰かが私はLINQとのforeachとフードの下で何が起こっているか理解するのに役立つことができれば、私は疑問に思うことをIEnumerableをイテレータ/についての何かがあります。
(私は)AllItems.ToList(によって両方の問題を治すことができることを承知しています。私は、反復する前に、2番目の例では、エラーをスローし、最初にはない理由を理解したいと思います)
ので、シーケンスは、常にすべての列挙に変更し、 'Enumerable.OfType'は遅延実行を使用して実装されているという事実に関連していないこの問題の原因ですか? –
@TimSchmelterさて、OfTypeは、ソース列挙子を直接使用して列挙します。チェックはしていませんが、オブジェクトを列挙してチェックをループ内に置いても同じことが起こります。基になる列挙子は、コントロールコレクションが変更されているかどうかのチェックを実行していません。 –
@ TimSchmelter:元のポストコードからすべてのLINQ操作を削除できると思われますが、まったく同じように動作します。 Reedの言うとおり、これは列挙型の実装の結果です。 OfTypeはそれとは関係ありません。 – StriplingWarrior