1

我正在将 Linq 与对象一起使用并且有一个问题。

实际工作负载在后台作业中处理。

不应将实际工作量放在进一步的任务上。更重要的是,处理实际工作项的方法执行速度非常快并给出了结果,因此完整的工作量被放在工作项的块中。

一次,我只处理列表的前 n 个对象,因此我取 n 个对象,然后将它们从工作项的完整列表中删除。

Roughly:

int amount = 100;
List<WorkItem> actualWorkload = null;

lock(lockWorkload){ // complete Workload is filled in other thread
    if (actualWorkload.Count > amount)
    {
        actualWorkload.AddRange(completeWorkload.Take(amount));
    }
    else
    {
        actualWorkload.AddRange(completeWorkload);
    }
    completeWorkload.RemoveAll(x => actualWorkload.Contains(x));
}
//do something with workitems Process(actualWorkload);

我的问题是:“Take”和“Remove”能否以某种方式结合起来,这样只需一步即可获取项目并直接从列表中删除这些项目?我搜索类似于 BlockingCollection 的“Take”的东西,它在返回时删除了一个项目。

4

2 回答 2

0

“Take and remove”对我来说听起来很像“Dequeue”,所以也许你可以只使用QueueConcurrentQueue

但是,枚举器不会从队列中删除项目,因此您必须自己重复调用Dequeue 。

于 2013-03-20T09:02:39.450 回答
0

即使有允许这样做的操作,在后台它仍然需要删除和添加它们。

但也许你不需要两个列表?也许您可能只有一个包含所有项目的列表,并且每个项目都有一个您设置为不同值或其他内容的状态。但当然,我不知道你的具体情况,所以这可能不可行。

于 2013-03-20T08:57:30.027 回答