I’ve been reading about foreach and list iteration, and I understand how to set it up.
What I have not been able to find throughout my research is how to iterate more than once. To better explain, here is my specific example:
I’m creating an A* path request manager that divides a given number of search cycles out over each request. So it will need to iterate through its LinkedList of requests, handing out one search cycle per request. Given that it starts with 1000 cycles, needless to say, it will need to go through its list of requests more than once in order to evenly distribute all of its cycles.
How can I ensure that the list will continue to iterate? Would this be a better task for a while or for loop? Or is there a way to do it with foreach?
In the event it would help anyone to further understand my question, here is my code as I have it now:
//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
You cannot modify a collection that you are iterating, the following code would throw an exception at runtime:
In order to iterate more than once, place your foreach within another loop construction. After all, doesn’t seem that foreach is the right tool for the job here.