Sachith Wickramaarachchi
Sachith Wickramaarachchi

Reputation: 5862

Most effective and elegant way to check parameters using if conditons

I have 3 parameters to check with some conditions.

As an example my code as follows,

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

There have 3 parameters and 8 probability can happen based on its values. Here I check those as above code. But it looks ugly and I think it's not the best way to do this. what is most efficient and elegant way to do this

Upvotes: 1

Views: 206

Answers (6)

Tejus
Tejus

Reputation: 724

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

Upvotes: 0

Arphile
Arphile

Reputation: 861

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

** Code edited because I mis-typed String.Join as String.Format **

or you can also use byte for this if you want to make case by case answers

            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;


            }

Upvotes: 3

RizkiDPrast
RizkiDPrast

Reputation: 1725

what about grouping it first like so:

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

also you need to note condition if it is equal. for example

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 ?

with if else statement or The conditional operator (?:) we can avoid that

Update

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

Upvotes: 3

user3532232
user3532232

Reputation: 257

I would concatenate the results:

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;

Upvotes: 0

Yurii N.
Yurii N.

Reputation: 5703

One possible way could be to create dictionary, which contains your truth table and corresponding response, for example:

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)];

It's up to you to decide which variant is more elegant, this is just one of the possible solution.

Note, that here's using C# 7.0 features, ValueTuple at the dictionary keys, and expression bodied method checkIfConnditions.

EDIT

Here is the example, which I have been used for testing:

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

Note, that _responses and checkIfConnditions must be static in that case.

Upvotes: 0

Chris Catignani
Chris Catignani

Reputation: 5306

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

Upvotes: 0

Related Questions