我正在寻找以下方面的良好设计/算法/图案:

我有很多待办事项。他们每个人都有一个估计的持续时间。我想将较大的列表分成较小的子列表,每个子列表最多包含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;
}

10-07 19:24
查看更多