如何将这四个函数转换成一个

本文关键字:转换 一个 函数 四个 | 更新日期: 2023-09-27 18:01:36

可以使用enum: enum StatusRouter { Stop = 0, Start, Resume, Suspect };

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;
}

如何将这四个函数转换成一个

你可以传入一个lambda来定义你想在每个元素上执行的操作。

类似:

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(我为我的答案发明的类型)替换为您正在处理的特定类型。

您可以通过将Action传递给执行所需操作的方法来使用策略模式(假设您的类名为Platform)—就像这样:

    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;            
    }

提取重复部分,即循环,并传递您想要执行的操作:

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;
}

当然,你总是可以放弃枚举,并传递一个你想要做的动作的函数委托。

首先,我将单个路由器的状态设置分解为一个单独的函数。我将使这个函数成为Router类的成员。

然后我写一个辅助函数获取所有检查过的路由器。最后是一个函数,该函数对每个函数调用SetRouterStatus函数。

这样,每个函数都有一个单独的职责,并且可以被重用。

你的代码的一些其他问题:Cheked应为Checked, Suspect应为Suspend

为什么你的函数返回一个总是假的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");
     }
}

(基于@peer的答案)

您可以将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;
         }
     }
}
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; 
}
}
相关文章: