使用条件来检查参数的最有效,最优雅的方法

时间:2018-09-13 04:35:29

标签: c# if-statement

在某些情况下,我有3个参数需要检查。

作为示例,我的代码如下,

    public static string checkIfConnditions(string msg, int score, int age)
    {
        var response = "";

        if (msg == "hello" && score >= 20 && age <= 25)
        {
            response = "All para success";
        }
        if (msg != "hello" && score >= 20 && age <= 25)
        {
            response = "Unmatching message";
        }
        if (msg == "hello" && score < 20 && age <= 25)
        {
            response = "Score not satisfied";
        }
        if (msg == "hello" && score >= 20 && age > 25)
        {
            response = "Age not satisfied";
        }
        if (msg != "hello" && score < 20 && age <= 25)
        {
            response = "Unmatiching message & Score not satisfied ";
        }
        if (msg != "hello" && score >= 20 && age > 25)
        {
            response = "Unmatiching message & Age not satisfied";
        }
        if (msg == "hello" && score < 20 && age > 25)
        {
            response = "Age & Score not satisfied";
        }
        if (msg != "hello" && score < 20 && age > 25)
        {
            response = "All parameter unsatisfied";
        }
        return response;
    }}

有3个参数,并且根据其值可以发生8个概率。在这里,我检查以上代码。但这看起来很难看,我认为这不是最好的方法。什么是最有效,最优雅的方法

6 个答案:

答案 0 :(得分:3)

首先将其分组的方式是这样:

public string checkIfConnditions(string msg, int score, int age)
{
   var response = "";

   if (msg == "hello") {
       response = score > 20 ? 
        age > 25 ? "Age not satisfied" : "All para success"
        : age < 25 ? "Score not satisfied" : "Age & Score not satisfied";       
   } else {
        if  (score > 20)
        {
            response = age < 25 ? "Unmatching message" : "Unmatiching message & Age not satisfied" ;    

        } else {

            response = age < 25 ? "Unmatiching message & Score not satisfied " : "All parameter unsatisfied" ;          
        }   
   }    
   return response;
 }

还需要注意条件是否相等。例如

if (msg == "hello" && score > 20 && age < 25)
{
    response = "All para success";
}

//and ...
if (msg == "hello" && score < 20 && age < 25)
{
    response = "Score not satisfied";
}
// what if score == 20 ?

使用if else语句或The conditional operator (?:)我们可以避免这种情况

更新

if(msg == "hello")
{
    if(score < 20)
    {
        response = age > 25 ? "Age & Score not satisfied" : "Score not satisfied";
    } else {
        response = age > 25 ? "Age not satisfied" : "All para success";
    }
} else {
    if(score < 20)
    {
        response = age > 25 ? "All parameter unsatisfied" : "Unmatiching message & Score not satisfied ";
    } else {
        response = age > 25 ? "Unmatiching message & Age not satisfied" : "Unmatching message";     
    }
}

答案 1 :(得分:3)

            List<String> Errors = new List<String>();
            int chk = 3;
            if ( msg != "hello" )
            {
                Errors.Add( "Unmatching message" );
            }
            if ( score < 20 )
            {
                Errors.Add( "Score not satisfied" );
            }
            if ( age > 25 )
            {
                Errors.Add( "Age not satisfied" );
            }

            if ( Errors.Count == 0 )
            {
                return "All para success";
            }
            else if ( Errors.Count == 3)
            {
                return "All parameter unsatisfied";
            }
            else
            {
                return String.Join( " & ", Errors );
            }

**因为我错误键入String.Join作为String.Format **,所以代码已编辑

或者如果您想逐个回答,也可以使用字节

            int flag = 0x0;
            if ( msg == "hello" )
            {
                flag |= 0x1;
            }
            if ( score > 20 )
            {
                flag |= 0x2;
            }
            if ( age < 25 )
            {
                flag |= 0x4;
            }
            switch ( flag )
            {
                case 0x7:
                    response = "All para success";
                    break;
                case 0x6:
                    response = "Unmatching message";
                    break;
                case 0x5:
                    response = "Score not satisfied";
                    break;
                case 0x4:
                    response = "Unmatiching message & Age not satisfied";
                    break;
                case 0x3:
                    response = "Score not satisfied";
                    break;
                case 0x2:
                    response = "Unmatiching message & Score not satisfied ";
                    break;
                case 0x1:
                    response = "Score not satisfied & Age not satisfied";
                    break;
                default:
                    response = "All parameter unsatisfied";
                    break;


            }

答案 2 :(得分:0)

    private const string MESSAGE = "hello";
    private const int SCORE = 20;
    private const int AGE = 25;
    public string checkIfConnditions(string msg, int score, int age)
    {
        if (msg == MESSAGE)
        {
            if (score > SCORE)
            {
                return age < AGE ? "All para success" : "Age not satisfied";
            }
            else
            {
                return age < AGE ? "Score not satisfied" : "Age & Score not satisfied";
            }

        }
        else
        {
            if (score > SCORE)
            {
                return age < AGE ? "Unmatching message" : "Unmatiching message & Age not satisfied";
            }
            else
            {
                return age < AGE ? "Unmatiching message & Score not satisfied " : "All parameter unsatisfied";
            }
        }            
    }

答案 3 :(得分:0)

一种可能的方法是创建字典,其中包含您的真值表和相应的响应,例如:

private readonly Dictionary<(bool isMsgValid, bool isScoreValid, bool isAgeValid), string> _responses 
    = new Dictionary<(bool, bool, bool), string>()
{
    [(true, true, true)] = "All para success",
    [(false, false, false)] = "All parameter unsatisfied",
    [(false, true, true)] = "Unmatching message",
    [(true, false, true)] = "Score not satisfied",
    [(true, true, false)] = "Age not satisfied",
    [(false, false, true)] = "Unmatiching message & Score not satisfied",
    [(false, true, false)] = "Unmatiching message & Age not satisfied",
    [(true, false, false)] = "Age & Score not satisfied"
};

public string checkIfConnditions(string msg, int score, int age)
    => _responses[(msg == "hello", score > 20, age < 25)];

由您决定哪种版本更优雅,这只是可能的解决方案之一。

请注意,这里使用的是C# 7.0 features,字典键处的ValueTuple和表达式合并的方法checkIfConnditions

编辑

以下是示例,我已将其用于测试:

public static class Program
{
    private static readonly Dictionary<(bool isMsgValid, bool isScoreValid, bool isAgeValid), string> _responses 
        = new Dictionary<(bool, bool, bool), string>()
    {
        [(true, true, true)] = "All para success",
        [(false, false, false)] = "All parameter unsatisfied",
        [(false, true, true)] = "Unmatching message",
        [(true, false, true)] = "Score not satisfied",
        [(true, true, false)] = "Age not satisfied",
        [(false, false, true)] = "Unmatiching message & Score not satisfied",
        [(false, true, false)] = "Unmatiching message & Age not satisfied",
        [(true, false, false)] = "Age & Score not satisfied"
    };

    public static string checkIfConnditions(string msg, int score, int age)
        => _responses[(msg == "hello", score > 20, age < 25)];

    public static void Main(string[] args)
    {
        Console.WriteLine(checkIfConnditions("hello", 45, 20));
        Console.WriteLine(checkIfConnditions("hello", 45, 30));
        Console.WriteLine(checkIfConnditions("hello", 10, 20));
        Console.WriteLine(checkIfConnditions("hello", 10, 30));
        Console.WriteLine(checkIfConnditions("goodbye", 45, 20));
        Console.WriteLine(checkIfConnditions("goodbye", 10, 30));
        Console.WriteLine(checkIfConnditions("goodbye", 45, 20));
        Console.WriteLine(checkIfConnditions("goodbye", 10, 30));
    }
}

请注意,在这种情况下,_responsescheckIfConnditions必须是静态的。

答案 4 :(得分:0)

 Sometimes these long "if's" can get a little messy.
        public string checkIfConnditions(string msg, int score, int age)
        {
            string response = string.Empty;
            if (msg == "hello")
            {
                if (score > 20 && age < 25)
                    response = "All para success";
                else if (score < 20 && age < 25)
                    response = "Score not satisfied";
                else if (score > 20 && age > 25)
                    response = "Age not satisfied";
                else if ( score < 20 && age > 25)     // Corrected this line
                    response = "Age & Score not satisfied";
            }
            else
            {
                if (score < 20 && age < 25)
                    response = "Unmatiching message & Score not satisfied ";
                else if (score > 20 && age > 25)
                    response = "Unmatiching message & Age not satisfied";
                else if (score > 20 && age < 25)
                    response = "Unmatching message";
                else if (score < 20 && age > 25)
                    response = "All parameter unsatisfied";
            }
            return response;
        }

答案 5 :(得分:0)

我将合并结果:

public string checkIfConnditions(string msg, int score, int age)
{
    List<String> msgList = List<String>();    
    if (msg != "hello")
        msgList.add("Message");

    if (score < 20)
        msgList.add("Score");

    if (age > 25)
        msgList.add("Age");

    var response = "All para success"
    for(int i=0;i<msgList.Count;i++)
    {
         if(i=0) 
             response = msgList[i] 
         else 
             response += " & "+ msgList[i] 

         if(i==msgList.Count-1)
             response += " not satisfied"
    }

    return response;