2011-07-10 164 views
0

您可以使用枚舉:enum StatusRouter { Stop = 0, Start, Resume, Suspect };如何將這4個函數轉換爲一個?

public bool StartSelectedRouter() 
{ 
    for (int i = 0; i < m_listPlatforms.Count; i++) 
    { 
     if (m_listPlatforms[i].IsCheked) 
      m_listPlatforms[i].Start(); 
    } 
    return false; 
} 
public bool ResumeSelectedRouter() 
{ 
    for (int i = 0; i < m_listPlatforms.Count; i++) 
    { 
     if (m_listPlatforms[i].IsCheked) 
      m_listPlatforms[i].Resume(); 
    } 
    return false; 
} 
public bool SuspendSelectedRouter() 
{ 
    for (int i = 0; i < m_listPlatforms.Count; i++) 
    { 
     if (m_listPlatforms[i].IsCheked) 
      m_listPlatforms[i].Suspend(); 
    } 
    return false; 
} 
public bool StopSelectedRouter() 
{ 
    for (int i = 0; i < m_listPlatforms.Count; i++) 
    { 
     if (m_listPlatforms[i].IsCheked) 
      m_listPlatforms[i].Stop(); 
    } 
    return false; 
} 
+1

有什麼問題嗎? – CodesInChaos

+0

如何將這四個函數轉換爲一個? – Mediator

+0

'家庭作業'標籤在哪裏? –

回答

7

您可以在拉姆達通過定義要每個元素上做的動作。

喜歡的東西:

public bool ChangeSelectedRouterState(Action<Router> action) 
{ 
    for (int i = 0; i < m_listPlatforms.Count; i++) 
    { 
     if (m_listPlatforms[i].IsCheked) 
      action(m_listPlatforms[i]); 
    } 
    return false; 
} 

這樣調用:

ChangeSelectedRouterState(r => r.Stop()); 

您需要替代型Router,我發明了我的回答,對您正在使用的特定類型。

+0

他在他的答案中使用Linq的地方是哪裏? – Jan

+0

@Jan,對不起,我不明白那個評論?這個問題沒有說明使用LINQ或不使用LINQ,也不是使用LINQ的答案。 – driis

+0

有人對你的回答發表了評論,比如'我不能在這個項目中使用Linq'。顯然它後來被刪除。 – Jan

1

您提取重複部分,環路,並通過動作你想做的事:

public bool DoSelectedRouter(StatusRouter statusRouter) 
{ 
    for (int i = 0; i < m_listPlatforms.Count; i++) 
    { 
     if (m_listPlatforms[i].IsCheked) 
     { 
      switch(statusRouter) 
      { 
       case StatusRouter.Stop: 
       m_listPlatforms[i].Stop(); 
       break; 
       case StatusRouter.Resume: 
       m_listPlatforms[i].Resume(); 
       break;  
       ....... 
      } 
     }    
    } 
    return false; 
} 

當然,你可以隨時丟棄枚舉並傳遞您想要執行的操作的功能委託。

0

您可以複製DoAction到函數,但是這是更具可讀性

public bool DoActionSelectedRouter(StatusRouter action) 
{ 
    for (int i = 0; i < m_listPlatforms.Count; i++) 
    { 
     if (m_listPlatforms[i].IsCheked) 
     { 
      DoAction(m_listPlatforms[i], action); 
     } 
    } 
    return false; 
} 

private void DoAction(Platform platform,StatusRouter action) 
{ 
    switch(action){ 
     case(StatusRouter.Stop): 
     { 
       platform.Stop(); 
       break; 
     } 
     case(StatusRouter.Start): 
     { 
       platform.Start(); 
       break; 
     } 
     case(StatusRouter.Suspend): 
     { 
       platform.Suspend(); 
       break; 
     } 
     case(StatusRouter.Resume): 
     { 
       platform.Resume(); 
       break; 
     } 
    } 
} 
+0

爲什麼downvote?這是最接近我做的答案。 – CodesInChaos

+0

@peer:break不是函數,所以沒有圓括號;) – digEmAll

2

你可以通過在行動傳遞到執行所需的動作(假設你的類被稱爲平臺)的方法使用策略模式 - 所以是這樣的:

public bool ActionSelectedRouter(Action<Platform> action) 
    { 
     for (int i = 0; i < m_listPlatforms.Count; i++) 
     { 
      if (m_listPlatforms[i].IsCheked) 
       action(m_listPlatforms[i]); 
     } 
     return false;    
    } 
0
Public bool StartRouterAction(StatusRouter Action) 
{ 

switch(Action) 
{ 
    case StatusRouter.Start: 

// your start action 

break; 

    case StatusRouter.Resume: 

// your Resume action 

    break; 

    case StatusRouter.Suspend: 

    // your suspend action 

     break; 


case StatusRouter.Stop: 

// your stop action 

break; 

} 

} 
0

首先我」 d將單個路由器的狀態設置分解爲單獨的功能。我會讓這個功能成爲Router類的成員。

然後,我會寫一個幫助函數,讓我所有檢查路由器。最後一個函數調用每個函數的SetRouterStatus函數。

這樣每個功能都有一個單一的責任,可以重複使用。

其他一些問題與您的代碼: Cheked應該CheckedSuspectSuspend

爲什麼你的函數返回一個總是假的bool

public void SetSelectedRoutersStatus(StatusRouter status) 
{ 
    foreach(var router in GetCheckedRouters()) 
    { 
     SetRouterStatus(router); 
    } 
} 

IEnumerable<Router> GetCheckedRouters() 
{ 
    return m_listPlatforms.Where(router=>router.Checked); 
} 

void SetRouterStatus(Router router,StatusRouter status) 
{ 
    switch(status) 
    { 
     case(StatusRouter.Stop): 
     { 
       router.Stop(); 
       break; 
     } 
     case(StatusRouter.Start): 
     { 
       router.Start(); 
       break; 
     } 
     case(StatusRouter.Suspend): 
     { 
       router.Suspend(); 
       break; 
     } 
     case(StatusRouter.Resume): 
     { 
       router.Resume(); 
       break; 
     } 
     default: 
      throw new NotSupportedException("Invalid StatusRouter"); 
    } 
} 

(基於@同行的答案)

相關問題