关于Foreach和List迭代的问题

时间:2011-09-10 22:59:05

标签: c# list foreach linked-list iteration

我一直在阅读有关foreach和列表迭代的内容,我了解如何设置它。

我在整个研究过程中未能找到的是如何不止一次迭代。为了更好地解释,这是我的具体例子:

我正在创建一个A *路径请求管理器,它将每个请求的给定数量的搜索周期分开。因此,它需要遍历其LinkedList个请求,每个请求分配一个搜索周期。不用说,它始于1000个周期,它需要不止一次地遍历其请求列表,以便均匀地分配所有周期。

如何确保列表继续迭代?对whilefor循环来说,这是一项更好的任务吗?或者有没有办法使用foreach

如果它有助于任何人进一步理解我的问题,这里是我现在的代码:

    //Method: UpdateSearches()
    //Purpose: to distribute all available search cycles
    //         between all active searches
    //         if a search completes or fails during this
    //         update, this method will notify the pathfinder
    //         who made the request
    //Parameters: none 
    //Returns: nothing
    public void UpdateSearches()
    {
        //start off with a full number of cycles
        int cyclesRemaining = this.searchCyclesPerUpdate;

        //cycle through all active requests
        foreach (Pathfinder request in this.searchRequests)
        {
            while ((cyclesRemaining > 0) && 
                   (this.searchRequests.Count != 0))
            {
                //one search cycle
                SearchStatus result = request.OneCycle();

                //if the search completes (success or failure)
                if (result == SearchStatus.targetFound ||
                    result == SearchStatus.targetNotFound)
                {
                    //remove this request from the queue
                    this.searchRequests.Remove(request);
                } //end if

                //move on to the next request
                cyclesRemaining--;
            } //end while
        } //end foreach
    } //end method

2 个答案:

答案 0 :(得分:4)

我不会使用列表,而是QueueConcurrentQueue - 您Enqueue例如1000个请求...然后您使用while循环Count > 0上的一个条件来迭代它的内容...你Dequeue一个请求并执行它...如果需要重新执行它,那么你再次Enqueue它。 ..这样它会被添加回来,但最终会让执行保持公平/均匀。

答案 1 :(得分:1)

您无法修改正在迭代的集合,以下代码将在运行时抛出异常:

    foreach (Pathfinder request in this.searchRequests)
    {
         //remove this request from the queue
         this.searchRequests.Remove(request);
    } //end foreach

为了多次迭代,将foreach放在另一个循环结构中。毕竟,似乎foreach不是这里工作的合适工具。