Вопрос о итерации по каждому элементу и списку - PullRequest
0 голосов
/ 11 сентября 2011

Я читал о foreach и итерации списка, и я понимаю, как его настроить.

То, что я не смог найти на протяжении всего моего исследования, - это итерация более одного раза. Чтобы лучше объяснить, вот мой конкретный пример:

Я создаю менеджер запросов пути A *, который делит определенное количество циклов поиска на каждый запрос. Поэтому ему нужно будет выполнить итерацию своих LinkedList запросов, раздавая один цикл поиска на каждый запрос. Учитывая, что он начинается с 1000 циклов, само собой разумеется, что он должен будет пройти через свой список запросов более одного раза, чтобы равномерно распределить все свои циклы.

Как я могу убедиться, что список будет продолжать повторяться? Будет ли это лучшей задачей для цикла while или for? Или есть способ сделать это с 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 ]

4 голосов
/ 11 сентября 2011

Я бы не использовал для этого список, кроме Queue или ConcurrentQueue - например, Enqueue, например 1000 запросов ... тогда вы используете *Цикл 1008 * с условием Count > 0 для итерации его содержимого ... вы Dequeue запрос и выполняете его ... если его необходимо выполнить повторно, просто Enqueue снова ...таким образом он будет добавлен обратно, но до конца, поэтому выполнение остается честным / четным.

1 голос
/ 11 сентября 2011

Вы не можете изменить коллекцию, которую вы перебираете, следующий код вызовет исключение во время выполнения:

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

Чтобы выполнить итерацию более одного раза, поместите ваш foreach в другую конструкцию цикла. В конце концов, кажется, что foreach не является подходящим инструментом для работы.

...