2015-05-06 58 views
0

這比邏輯問題更多的是邏輯問題。基於其他變量列表更新變量

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 

    } 
    } 
} 

每個任務對象t都有自己的TaskStatus字符串。

  1. 如果所有的任務狀態是 「DONE」,以 「完成」 設置步驟狀態

  2. 如果所有的任務狀態是 「TODO」,設置步驟狀態爲 「TODO」

  3. 如果任務狀態之一是「做」,設置步驟狀態到「做」

  4. 如果任務狀態之一是「DONE」,一個是「TODO」,設置步驟狀態到「做」

實現此目的的最佳方法是什麼?在代碼複雜性和較少靈活性方面。

我如何解決它:

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

使用'All'和'Any' LINQ擴展方法? – Blorgbeard

+0

你能舉一個例子嗎?聽起來很有趣 。我對linq不太熟悉。 –

+0

@dominik發佈了一個顯示如何使用'All'的答案。我用一個稍微不同的方法發佈了一個答案。 – Blorgbeard

回答

1
foreach(var step in steps) 
{ 
    step.StepStatus = 
     step.Tasks.All(x => x.Status == "DONE") ? "DONE" : 
     step.Tasks.All(x => x.Status == "TODO") ? "TODO" : 
     step.Tasks.Any(x => x.Status == "DOING") ? "DOING" : 
     step.Tasks.Any(x => x.Status == "DONE ") && step.Tasks.Any(x => x.Status == "TODO") ? "DOING" 
     : "UNKNOWN_STATUS"; 
} 
+0

這將肯定工作。我只想提到它在很多不需要解決這個問題的情況下多次遍歷任務列表。 –

0

由於Blorgbeard指出的那樣,這是一個完美的使用情況一切及任何。舉例:

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

t.Status ==完成只是一個例子,它可以是任何布爾表達式。

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