2008年10月31日

LINQ to XMLのハロウィーン問題

   このエントリーをはてなブックマークに追加 Clip to Evernote
宣言型コードと命令型コードの混在のバグ (C#) (LINQ to XML)
に、「ハロウィーン問題」と呼ばれる問題が載っている。

XMLの要素を反復処理するコードを LINQ を使用して記述する場合、
そのループ処理の中で、要素の追加や削除を行うと、意図どおりに動作しないというもの。

あれ、これって、通常のコレクションでも同じ問題があるんじゃないの。
と思って、以下のようなコードを書いてみた。

 var list = new List {
1,2,3,4,5,6,7
};
foreach (var i in list) {
list.Add(i);
}

これを実行してみたら、なんと、

「{System.Collections.ListDictionaryInternal}コレクションが変更されました。列挙操作は実行されない可能性があります。」

という例外が出る。
へー、そんなチェックをしていたんだ。普段こんなコードを書いたことが無いので、初めて知りました。
LINQ to XMLだと、例外が出ないんですね。



この記事へのコメント
IEnumerable の方は foreach 中に一覧から検索値だけ削除使用としてぶつかった記憶があります(汗
Posted by かるあ at 2008年11月01日 18:26
かるあさん
でも例外が出てくれるってのは有り難いですよね。
Posted by Gushwell at 2008年11月01日 21:02
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51671157