基于其他变量列表更新变量

时间:2015-05-06 21:33:57

标签: c# logic

这更像是一个逻辑问题,而不是实现。

class Step {    
  public string StepStatus {get ; set;}

  public List<Task> Tasks {get ; set;}

  public Step() {

    Tasks= new List<Task>() ;
  }

  //on some event I call this method that updates StepStatus based on status of
  //all task statuses

  private void UpdateStepStatusFromTasks() {
    foreach (Task t in Tasks) {
            // t.TaskStatus
            // set StepStatus here  
            // LOGIC here

    }
  }
}

每个Task对象t都有自己的TaskStatus字符串。

  1. 如果所有任务状态为&#34; DONE&#34; ,将步骤状态设置为&#34;完成&#34;

  2. 如果所有任务状态为&#34; TODO&#34; ,将步骤状态设置为&#34; TODO&#34;

  3. 如果其中一个任务状态为&#34; DOING&#34; ,将步骤状态设置为&#34;执行&#34;

  4. 如果其中一个任务状态为&#34; DONE&#34;一个是&#34; TODO&#34; ,将步骤状态设置为&#34;执行&#34;

  5. 实现此目的的最佳方法是什么?在代码复杂性和较少的kludgyness方面。

    我是如何解决的:

     private void UpdateStepStatusFromTasks()
            {
    
    
    
                if ( Tasks.All(t => t.TaskStatus.Equals("Not Started")))
                    StepStatus = "Not Started";
                else if (Tasks.All(t => t.TaskStatus.Equals("Completed")))
                    StepStatus = "Completed";
                else
                    StepStatus = "In Progress";
    
    
    
    
            }
    

3 个答案:

答案 0 :(得分:1)

8192

答案 1 :(得分:0)

正如Blorgbeard所指出的,这是所有人和任何人的完美用例。一个例子:

tasks.All( (t) => t.Status == Done);

t.Status ==完成只是一个例子,它可以是任何布尔表达式。

答案 2 :(得分:0)

你可以这样做:

var taskStatuses = Tasks.Select(t => t.TaskStatus).Distinct().ToList();
if (taskStatuses.Count == 1) {
    // all tasks are the same status, so that's the step status
    return taskStatuses[0];
}
if (taskStatuses.Contains("DOING")) return "DOING";
if (taskStatuses.Contains("DONE") && taskStatuses.Contains("TODO")) {
    return "DOING";
}
// whatever other logic you want