2016-05-25 4 views
0

Я работаю над программой, которая назначает людей миссиям в течение дня.Мой метод не работает должным образом

В течение 8 часов я изо всех сил пытался выяснить, что случилось с моим методом. Это должен взять список имен, список миссий и счетчик 24 часов и назначить каждого человека миссии в час X. Если в этой миссии требуется более одного человека, она также попытается назначить следующий (если нет каких-либо условий, которые препятствуют тому, чтобы это лицо было назначено миссии).

После того, как все люди в списке назначены, программа должна сбросить список людей, которых нужно назначить, и начать назначать их снова.

Когда я запускаю свой код, есть только 1 раунд назначения, а остальная часть таблицы остается пустой.

Я попытался понять, что случилось с логикой, но я просто не могу, и это так РАСПРОСТРАНЯЕТСЯ !! Поэтому, пожалуйста, помогите мне!

Код:

public string[,] AssignPersonsToMission() 
{ 
    bool containCondition; // any item of Person.Conditions is in mission.Conditions? 
    int assignedCounter = 0; // how many people assigned to a mission at given hour 
    string[,] table = new string[missions.Count, 24]; // columns = missions, rows = hour of day 
    List<Person> personsToAssign = persons; // filling list with people to assign 
    List<Person> assignedPersons = new List<Person>(); // a list of people that have been assigned 

    for (int mission = 0; mission < missions.Count; mission++) //go throught columns 
    { 
     for (int hour = 0; hour < 24; hour++) //go through rows 
     { 
      if (personsToAssign.Count == 0) //if all the people have been assigned to missions 
      { 
       personsToAssign = persons; // refill personsToAssign list with original list of people 
       assignedPersons.Clear(); // reset assigned Persons list 
      } 
      assignedCounter = 0; // reset assignedCounter 
      foreach (Person person in personsToAssign.ToList()) //go through each person that can be assigned 
      { 
       containCondition = missions[mission].Conditions.Intersect(person.Conditions).Any(); // is there any condition in mission that the person has? 
                            //if yes - that person cannot be assigned to the mission 
       if (!containCondition) 
       { 
        table[mission, hour] += person.Name + "|"; //put person in mission at a given hour 
        assignedPersons.Add(person); //add the person to a list of assigned people 
        personsToAssign.Remove(person);//remove the person from the list of people to assign 
        assignedCounter++;//increament how many people assigned to this mission at this hour 

        if (assignedCounter < missions[mission].NumOfPeople) //if not enough people have been assigned to the mission 
        { 
         continue; //go to the next person to assign 
        } 
        else { break; }//go the the next hour 

       }// END OF if (!containCondition) 

      }//END OF foreach (Person person in personsToAssign.ToList()) 

     }//END OF for (int hour = 0; hour < 24; hour++) 


    }//END OF for (int mission = 0; mission < missions.Count; mission++) 

    return table; 
} 
+1

Вам следует подумать о выборе названия, которое суммирует конкретную проблему. Чтобы другие люди могли найти ваш пост, когда они столкнулись с одной и той же проблемой. [Помощь] (http://stackoverflow.com/help/how-to-ask) здесь –

+0

Итак, когда вы переходите к отладчику, вы не можете сказать, почему таблица не заполняется? – stuartd

ответ

1

Проблема заключается в том, что вы хотите изменить свой первоначальный список persons

Изменить это:

List<Person> personsToAssign = persons; 

к:

List<Person> personsToAssign = new List<Person> (persons); 

Вы не делаете копию списка, вы просто устанавливаете ссылку на него. Поэтому, если вы удаляете человека с personsToAssign, вы также удаляете его с persons, так как обе переменные указывают на тот же список в памяти.

+0

Я люблю тебя так много чувака –

Смежные вопросы