2012-01-24 10 views
0

私はオブジェクトの集合を持っています。それぞれのオブジェクトの集合は以下のコードから明らかです。私は、すべての添付ファイルを削除し、セクションを削除するので、私は関連するファイルを削除することができます 'dispose'メソッドを作成したいと思います。オブジェクトはさまざまな場所で使用されているので、「使用する」方法は私が見る限り適切ではありません。コレクションは変更されているため、以下のことは(分かりやすく)失敗します。C#で入れ子にされたコレクションを廃棄する

// Find files and get names. 
foreach (DocumentSection s in this.sections) 
{ 
    foreach (EmailAttachment a in s.SectionAttachments) 
    { 
     // Get file location, then clear attachment to release file handle. 
     filesToDelete.Add(a.TempAttachmentFileLoc); 
     s.SectionAttachments.Remove(a); 
     a = null; 
    } 
    this.sections.Remove(s); 
    s = null; 
} 

私は使用後に一時ファイルを削除したいので、私はこのすべてをやっている理由は、(TempAttachmentFileLoc)ですが、それは使用中だと現在は削除することはできません。

+3

あなたは疑問に思っていません.....あなたは何かについてうなじき、解決したいと思っています。 :) –

+0

逆方向に繰り返して最後に削除しますか?または、Clearメソッドを使用してください:http://stackoverflow.com/questions/308466/how-to-modify-or-delete-items-from-an-enumerable-collection- while-iterating-thro –

答えて

1

リストを列挙した後でそれを消去してみませんか?

// Find files and get names. 
foreach (DocumentSection s in this.sections) 
{ 
    foreach (EmailAttachment a in s.SectionAttachments) 
    { 
     // Get file location, then clear attachment to release file handle. 
     filesToDelete.Add(a.TempAttachmentFileLoc); 
     //s.SectionAttachments.Remove(a); // removed this! 
     //a = null; 
    } 
    s.SessionAttachments.Clear(); // Added this 
    //this.sections.Remove(s); // Removed this 
    //s = null; 
} 
this.sections.Clear(); // Added this 

これは、実行しようとしていることを行う必要があります。

+0

それを考えてみましょう、 'sections'コレクション全体をクリアしようとしているからです。 's.SessionAttachments.Clear()'の必要はありません。コレクションとドキュメントがどこにも参照されていないと仮定すると、 'this.sections.Clear()'の呼び出しの後に次のガベージコレクションでクリーンアップされます。 –

+0

Jimに感謝します。私はこれをやったが、奇妙なファイルハンドルの問題がまだあります。しかし、あなたの努力を感謝し、私はこれが問題なしで処分を行うと確信しています。 :) – Glinkot

0

リストから項目を削除してDisposeにする必要はありません。あなたのリストを繰り返し、それぞれを順番に処理してください。コレクションを空にしたい場合は、ループが完了した後に行います。

関連する問題