У меня есть список пользователей, а также их объем работы, которую они могут выполнять, а также у меня есть список задач, которые необходимо назначить пользователям в соответствии с их возможностями с использованием алгоритма циклического перебора.
Для EX: -
Если пользователь 1 имеет емкость 7 задач ,
пользователь 2 имеет 3 задачи ,
пользователь 3 имеет 5 задач. и общее количество заданий равно 10, тогда оно должно быть поровну распределено между пользователями, как показано ниже.
пользователь 1 имеет емкость 7 задач, и назначается только 4 задачи.
пользователь 2 имеет 3 задания, и назначено только 3 задания.
пользователь 3 имеет емкость 5 задач, и назначается только 3 задачи.
Я использую приведенные ниже фрагменты кода и не уверен, является ли это идеальным решением для назначения задачи в соответствии с пропускной способностью с использованием алгоритма циклического перебора. это будет очень полезно, если некоторые из них могут помочь и оптимизировать код.
Список пользователей: -
var userList = new List<User> {
new User { userId = "U0", TotalCap=7 } ,
new User { userId = "U1" , TotalCap=3} ,
new User { userId = "U3" , TotalCap=5}
};
Список заданий: -
var TaskList = new List<Task> {
new Task { TaskId = "T1", TaskDetails="first task" } ,
new Task { TaskId = "T2" , TaskDetails="2nd task"} ,
new Task { TaskId = "T3", TaskDetails="3rd task" } ,
new Task { TaskId = "T4" , TaskDetails="4th task"} ,
new Task { TaskId = "T5", TaskDetails="5th task" } ,
new Task { TaskId = "T6" , TaskDetails="6th task"} ,
new Task { TaskId = "T7" , TaskDetails="7th task"},
new Task { TaskId = "T8", TaskDetails="8th task" } ,
new Task { TaskId = "T9", TaskDetails="9th task" } ,
new Task { TaskId = "T10" , TaskDetails="10th task"} ,
new Task { TaskId = "T11", TaskDetails="11th task" }
};
Логика для назначения задач пользователям по их емкости
List<taskAssignationdetails> objtaskAssignationdetails = new List<taskAssignationdetails>();
int a = 0; int x = 0;
for (int i = 0; i < TaskList.Count(); ++i)
{
for (int q = 0; q < userList.Count(); q++)
{
taskAssignationdetails objnewTask = new taskAssignationdetails();
int count = 0;
var ss = objtaskAssignationdetails.Where(p => p.userId == userList[q].userId).ToList().OrderByDescending(s => s.TotalCap).FirstOrDefault();
if (ss == null) { count = 0; } else { count = ss.TotalCap; }
if (userList[q].TotalCap > count)
{
if (i <= TaskList.Count())
{
objnewTask.AllDetails = "UserID:- " + userList[q].userId + "| UserCap:- " + userList[q].TotalCap + " |CurrentCap:-" + Convert.ToInt32(a + 1) +
"| TaskID:- " + TaskList[x].TaskId + " |TaskDetails:-" + TaskList[x].TaskDetails;
objnewTask.Details = TaskList[x].TaskId + "_" + TaskList[x].TaskDetails;
objnewTask.TaskId = TaskList[x].TaskId;
objnewTask.TotalCap = Convert.ToInt32(a + 1);
objnewTask.userId = userList[q].userId;
objnewTask.userCap = userList[q].TotalCap;
objtaskAssignationdetails.Add(objnewTask);
x++;
}
}
}
a++;
}