我正在使用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',它会在返回时移除一个项目。
答案 0 :(得分:0)
即使存在允许该操作的操作,在后台仍然需要删除并添加它们。
但也许你不需要两个名单?也许你只能有一个包含所有项目的列表,并且每个项目的状态都设置为不同的值或其他值。但是,当然,我不知道你的具体情况,所以这可能是不可行的。
答案 1 :(得分:0)
“取出并删除”声音给我很像“Dequeue”,所以也许你可以使用Queue或ConcurrentQueue?
但是,枚举器不会从队列中删除项目,因此您必须自己反复调用Dequeue。