7

私が作成したクラス (DownloadOperation と呼ばれる) によってダウンロード情報が管理されるマルチスレッドのダウンロード マネージャーを作成しています。ダウンロードはリストに保持されます (ダウンロードと呼ばれます)。foreachクラス (queryCompleted) の関数が true を返したときに、リストからオブジェクトを削除する必要がありますが、ループ内からリストから要素を削除できないことがわかりました。同じ効果を得るための最良の方法は何ですか?私はC#に比較的慣れていないので、私の愚かさを許してください。

private void removeInactiveDownloads()
    {
        foreach (DownloadOperation dl in download)
        {
            if (dl.queryComplete() == true)
            {
                // if download is no longer in progress it is removed from the list.
                download.Remove(dl);
            }
        }
    }
4

3 に答える 3

15

List<T>方法があります

public int RemoveAll(
    Predicate<T> match
)

述語に一致するすべての要素を削除します: http://msdn.microsoft.com/en-us/library/wdka673a.aspx

したがって、次のようなものをお勧めします。

download.RemoveAll(x => x.queryComplete());

(すでに true または false を返し== trueているので、これは必要ありません!).queryComplete()

于 2013-07-02T23:42:58.830 に答える
3

Foreach ループの代わりに For ループで逆方向に繰り返す

for(int i = download.Count; i >= 0; i--)
{
    if (download[i].queryComplete())
    {
       // if download is no longer in progress it is removed from the list.
       download.RemoveAt(i);
    }
}
于 2013-07-02T23:42:23.343 に答える
1

パタシュの答えは一般的に最良の解決策ですが、あなたのコード例に基づいて、別のアプローチを取ることをお勧めします。

ダウンロードリストを定期的にポーリングして、完了したリストを見つけていますか? イベント サブスクリプションはおそらくより良い解決策です。C# は初めてなので、言語にこのパターンのサポートが組み込まれていることを知らなかった場合:イベント

ダウンロードがCompleted完了すると、次のようなイベントが発生する可能性があります。これは、リストを管理するコードによってサブスクライブされます。

private void AddDownload(DownloadOperation dl) {
    download.Add(dl);
    dl.Completed += (s, e) => download.Remove(dl);
}
于 2013-07-03T00:30:55.187 に答える