您可以使用枚举: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;
}
答案 0 :(得分:7)
你可以传入一个lambda来定义你想对每个元素做的Action。
类似的东西:
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
替换为您正在处理的特定类型。
答案 1 :(得分:2)
您可以通过将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;
}
答案 2 :(得分: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;
}
当然,您可以随时丢弃枚举并传递您想要执行的功能代理。
答案 3 :(得分: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;
}
}
}
答案 4 :(得分: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;
}
}
答案 5 :(得分:0)
首先,我将单个路由器的状态设置分解为单独的功能。我将此函数作为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的回答)