使用大量ifs简化代码

use*_*618 0 c# optimization simplify

我有一个基于枚举的方法,并且在开始时我们有这种情况:

public void MyMetohd(Somestatus status)
{
if(status == Somestatus.Enum1)
{
DoA();
DoB();
DoC();
DoD();
DoE();
}
if(status == Somestatus.Enum2)
{
DoA();
DoB();
DoC();
DoD();
}

if(status == Somestatus.Enum3)
{
DoA();
DoB();
DoC();
}

if(status == Somestatus.Enum4)
{
DoA();
DoB();
}

if(status == Somestatus.Enum5)
{
DoA();
}
}
Run Code Online (Sandbox Code Playgroud)

你会如何优化这种代码(它不是我的代码)?

zsa*_*ank 5

如果设置了每个成员的值,则可以使用比较enum.

enum Somestatus : int
{
    Enum1 = 1,
    Enum2 = 2,
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后只需使用比较来完成代码.因为你总是这样做DoA(),所以从那开始.

if(status <= Somestatus.Enum5)
    DoA();

if(status <= Somestatus.Enum4)
    DoB();

if(status <= Somestatus.Enum4)
    DoC();
...
Run Code Online (Sandbox Code Playgroud)

继续这样.这样,当值为时,将调用所有函数Enum1.


Bro*_*ook 5

通过优化我会假设你的意思是"制造DRYer".

你将不得不在易于阅读的代码(你拥有的代码,虽然略有重复性)和尽可能少重复的代码之间取得平衡.

只是输入这个让我觉得很脏,但如果你想要的是DRY和更少的LOC,我认为它会做你想要的.

switch (status)
            {
                case Somestatus.Enum1:
                    DoE();
                    goto SomeStatus.Enum2;
                case Somestatus.Enum2:
                    DoD();
                    goto SomeStatus.Enum3;
                case Somestatus.Enum3:
                    DoC();
                    goto SomeStatus.Enum4;
                case Somestatus.Enum4:
                    DoB();
                    goto SomeStatus.Enum5;
                case Somestatus.Enum5:
                    DoA();
                    break;
                default:
                    throw new InvalidArgumentException("Unknown Status");
            }
Run Code Online (Sandbox Code Playgroud)