繁体   English   中英

满足条件时从列表中删除项目

[英]Removing items from a list when a condition is met

我正在编写一个多线程下载管理器,其中下载信息由我编写的类(称为DownloadOperation)管理。 下载保存在列表中(称为下载)。 我需要在类(queryCompleted)中的函数返回true时从列表中删除对象,但发现无法从foreach循环中的列表中删除元素。 获得相同效果的最佳方法是什么? 我对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);
            }
        }
    }

编辑 - 更正了示例代码中的错误。

List<T>有一个方法

public int RemoveAll(
    Predicate<T> match
)

删除与谓词匹配的所有元素: http//msdn.microsoft.com/en-us/library/wdka673a.aspx

所以我建议像:

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

(注意,因为.queryComplete()已经返回true或false,所以.queryComplete() == true !)

在For循环中向后迭代而不是Foreach循环

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);
    }
}

Patashu的答案通常是最好的解决方案,但根据您的示例代码,我建议完全采用另一种方法。

您是否定期轮询下载列表以查找已完成的下载列表? 事件订阅可能是更好的解决方案。 由于您不熟悉C#,如果您不知道该语言对此模式具有内置支持: 事件

下载可以在Completed时引发已Completed事件,该事件由管理列表的代码订阅,例如:

private void AddDownload(DownloadOperation dl) {
    download.Add(dl);
    dl.Completed += (s, e) => download.Remove(dl);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM