C#"恶化"名单?

Mik*_*ike 4 .net c# collections

我有一份工作清单,我正在努力工作,直到所有工作都耗尽,但不知道如何处理.我试图模仿的想法是:

foreach(Work w in _workList) {
   res = DoSomethingOnWork(w);
   if(res) {
       _workList.Remove(w);
   }
}
Run Code Online (Sandbox Code Playgroud)

原因是,在"DoSomethingForWork(w)"中,当时的工作可能不是我想要做的,所以我将跳过那个并继续下一个.当我在列表的末尾时,我想回到列表中.在我写一个集合来处理这个问题之前,我很好奇是否已经在.NET中处理这种情况了.

提前致谢!

Nik*_*696 14

这类是Queue类的用途.它拥有一个集合,您只需将每个项目出列即可使用它.这是一个持久,最后的收藏品.

如果您决定跳过一个,可以将其重新排队以供日后使用.

您还可以查看Stack类,它类似但是是一个后进先出的集合.

  • 我不确定队列如何使这个问题有所不同.这是_still_`获取项目; 检查项目; 删除项目;`除了现在它是`删除项目; 检查项目; 添加项目;` (2认同)
  • 问题是一样的.问题是关于使用哪个集合类来获得最佳结果.当您处于迭代/枚举该集合的循环中时,某些集合类不允许您删除项目. (2认同)

Eri*_*ert 7

迭代时修改集合是非常危险的; 这样做是崩溃的秘诀.

在你的情况下,我会做的是使用队列,或者可能得到一点点发烧友并实现优先级队列.队列具有以下属性:最近添加的东西是最后一个要服务的东西,就像银行队列一样; 你加入了行的末尾,并且在你之前的每个人都得到了服务.所以你的循环看起来像这样:

while(queue.Count > 0)
{
    var currentCustomer = queue.Dequeue();
    bool success = ServiceCustomer(currentCustomer);
    if (!success)
    {
        // the customer couldn't be serviced. Send them to the
        // back of the line so that we service other customers before 
        // trying again.
        queue.Enqueue(currentCustomer);
    }
}
Run Code Online (Sandbox Code Playgroud)

PriorityQueue的工作方式与队列类似,只是每个任务都获得与之关联的优先级.优先级较高的任务可以成为VIP,并将队列跳转到优先级较低的任务之前.实现自己的优先级队列并不太难.