开关/外壳和 If - 更适合我的情况?[已结束]

Switch/Case and If - Better Solution for my case? [closed]

提问人:Raphael Aracelli 提问时间:9/5/2023 最后编辑:Raphael Aracelli 更新时间:9/5/2023 访问量:70

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来用事实和引文来回答。

3个月前关闭。

目前,我需要根据从计算机名称、位置和扇区中获取的 2 个变量自动进行安装和配置。每个位置的每个扇区都有完全不同的配置。

有没有比在每个位置的“开关/案例”中对每个扇区使用“if”更好的方法?(每个位置的扇区数小于位置数)

谢谢!

例:

public void install(string l, string s)
{
    
    switch (l)
    {
        case "10":
            {
                if (s == "CS" || s == "BO")
                {
                    //do stuff1
                    //do stuff2
                }
                if (s == "RR")
                {
                    //do stuff1
                    //do stuff2
                }
                if (s == "RC")
                {
                    //do stuff1
                    //do stuff2
                }
                break;
            }

        case "20":
            {
                if (s == "CS" || s == "BO")
                {
                    //do stuff1
                    //do stuff2
                }
                if (s == "RE")
                {
                    //do stuff1
                    //do stuff2
                    //do stuff3
                }
                if (s == "RC")
                {
                    //do stuff1
                    //do stuff2
                }
                break;
            }

        case "21":
            {
                if (s == "CS" || s == "BO")
                {
                    //do stuff1
                    
                }
                if (s == "RE")
                {
                    //do stuff1
                    //do stuff2
                }
                if (s == "RX")
                {
                    //do stuff1
                    //do stuff2
                }
                break;
            }
        (...)
    }
}

使用 Switch/Case,如果它变得太大而且有点凌乱,我不知道是否有更好的方法让我忘记。

C# switch-语句

评论

2赞 gunr2171 9/5/2023
看来您的代码目前有效,并且您正在寻求改进它。一般来说,这些问题对于这个网站来说太固执己见了,但你可能会发现 CodeReview.SE 运气更好。请记住阅读他们的要求,因为它们比本网站更严格一些。
0赞 gunr2171 9/5/2023
您可能想查看您可以使用的工具,learn.microsoft.com/en-us/dotnet/csharp/language-reference/... learn.microsoft.com/en-US/dotnet/csharp/language-reference/......

答:

1赞 Levi 9/5/2023 #1

您可以使用 .else if

 public void install(string l, string s)
        {

            switch (l)
            {
                case "10":
                    {
                        if (s == "CS" || s == "BO")
                        {
                            // executed only if "condition" is true                                
                        }
                        else if (s == "RR")
                        {
                             // executed only if "condition" was false and "other condition" is true                               
                        }
                        else 
                        {
                            // executed only if both "condition" and "other condition" were false
                        }
                        break;
                    }
            }
        }

答案参考:if、else 和 else if 有什么区别?

1赞 eloiz 9/5/2023 #2

如果您使用的是 C# 7.0 或更高版本,则可以使用 switch-when 来避免使用 if。

switch (l)
{
    case @"10" when s is @"CS" or @"BO":
        
        break;
    case @"10" when s is @"RR":
        break;
    case @"10" when s is @"RC":
        break;
    
    case @"20" when s is @"CS" or @"BO":
        break;
    case @"20" when s is @"RE":
        break;
    case @"20" when s is @"RC":
        break;
        
    case @"21" when s is @"CS" or @"BO":
        break;
    case @"21" when s is @"RE":
        break;
    case @"21" when s is @"RX":
        break;
}
1赞 Enigmativity 9/5/2023 #3

对于这些情况,我倾向于使用字典方法。

代码要简洁得多。

var stuff = new Dictionary<(string l, string s), Action>()
{
    { ("10", "CS"), () => { Stuff1(); Stuff2(); } },
    { ("10", "BO"), () => { Stuff1(); Stuff2(); } },
    { ("10", "RR"), () => { Stuff1(); Stuff2(); } },
    { ("10", "RC"), () => { Stuff1(); Stuff2(); } },
    { ("20", "CS"), () => { Stuff1(); Stuff2(); } },
    { ("20", "BO"), () => { Stuff1(); Stuff2(); } },
    { ("20", "RE"), () => { Stuff1(); Stuff2(); Stuff3(); } },
    { ("20", "RC"), () => { Stuff1(); Stuff2(); } },
    { ("21", "CS"), () => { Stuff1(); } },
    { ("21", "BO"), () => { Stuff1(); } },
    { ("21", "RE"), () => { Stuff1(); Stuff2(); } },
    { ("21", "RX"), () => { Stuff1(); Stuff2(); } },
};

if (stuff.TryGetValue((l, s), out Action action))
    action();

这也允许运行时配置,这是普通开关和 ifs 不允许的。