我正在寻找以下方面的良好设计/算法/图案:
我有很多待办事项。他们每个人都有一个估计的持续时间。我想将较大的列表分成较小的子列表,每个子列表最多包含4个小时的工作。
我当前的算法是这样的:
while( index < list.Count )
{
List<string> subList = CreateSublist( ref index );
SaveSubList(subList);
}
将索引作为ref传递时感觉很尴尬,而不是OOD。我真的像流一样消费了TODO列表,所以我想知道是否可以做类似的事情,但是我有点像C#新手。我目前也仅限于C#2.0。这里有什么好的设计快速指南吗?
最佳答案
您可以用一种方法填充所有内容:
List<List<TodoTask>> GetTodoTasks(IEnumerable<TodoTask> tasks, int timeWindow)
{
List<List<TodoTask>> allTasks = new List<List<TodoTask>>();
List<TodoTask> tasks = new List<TodoTask>();
int duration = 0;
foreach(TodoTask task in tasks)
{
if(duration > timeWindow)
{
allTasks.Add(tasks);
duration = 0;
tasks = new List<TodoTask>();
}
tasks.Add(task);
duration += task.Duration;
}
allTasks.Add(tasks);
return allTasks;
}
或者,使用迭代器:
IEnumerable<List<TodoTask>> GetTodoTasks(IEnumerable<TodoTask> tasks, int timeWindow)
{
List<TodoTask> tasks = new List<TodoTask>();
int duration = 0;
foreach(TodoTask task in tasks)
{
if(duration > timeWindow)
{
yield return tasks;
duration = 0;
tasks = new List<TodoTask>();
}
tasks.Add(task);
duration += task.Duration;
}
yield return tasks;
}