Search code examples
c#operatorsternary

How To Use Nested Ternary Operator In C#?


Here i have used if , else if condition to show an error message and make some label visible and invisible, but i am trying to use ternary operator to do so but i am quite unfamiliar with ternery operator and unable to use it for all condition i have in my if else code.
So any help with my code will be highly appreciated. Thank you.

Below is my code

        catch (Exception ex)
        {
            if (ex.Message == "Parent Menu Title Required")
            {
                metroLabel4.Visible = true;
                metroLabel5.Visible = false;
                metroLabel6.Visible = false;
                metroLabel4.Text = ex.Message;
            }
            else if (ex.Message == "Menu Title Required")
            {
                metroLabel4.Visible = false;
                metroLabel5.Visible = true;
                metroLabel6.Visible = false;
                metroLabel5.Text = ex.Message;
            }
            else if (ex.Message == "Form Name Required")
            {
                metroLabel4.Visible = false;
                metroLabel5.Visible = false;
                metroLabel6.Visible = true;
                metroLabel6.Text = ex.Message;
            }
            else
            {
                metroLabel4.Visible = true;
                metroLabel5.Visible = true;
                metroLabel6.Visible = true;
                metroLabel4.Text = "Parent Menu Title Required";                  
                metroLabel5.Text = "Menu Title Required";
                metroLabel6.Text = "Form Name Required";
            }
        }

Solution

  • The ternary operator is not a good fit for your problem. It is used to set the value of one variable to one of two values, based on a predicate:

    var thingToSet = predicateA ? 
                     ifPredicateAIsTrue : 
                     ifPredicateAIsFalse;
    

    This is the same as:

    if (predicateA)
        thingToSet = ifPredicateAIsTrue;
    else
        thingToSet = ifPredicateAIsFalse;
    

    To nest ternary expressions, place a new ternary expression in the value to set:

    var otherThingToSet = predicateB ? (
                                predicateC ? 
                                ifPredicateCIsTrue : 
                                ifPredicateCIsFalse
                            ) : (
                                predicateD ? 
                                ifPredicateDIsTrue : 
                                ifPredicateDIsFalse
                            );
    

    This is equivalent to:

    if (predicateB)
    {
        if (predicateC)
            otherThingToSet = ifPredicateCIsTrue;
        else
            otherThingToSet = ifPredicateCIsFalse;
    }
    else
    {
        if (predicateD)
            otherThingToSet = ifPredicateDIsTrue;
        else
            otherThingToSet = ifPredicateDIsFalse;
    }
    

    As you can see, this is not really a good fit for your problem, as you're trying to set the value of several variables, based on the exception message.

    A better fit for your problem would be a switch statement:

    switch (ex.Message)
    {
        case "Parent Menu Title Required":
            metroLabel4.Visible = true;
            metroLabel5.Visible = false;
            metroLabel6.Visible = false;
            metroLabel4.Text = ex.Message;
            break;
        case "Menu Title Required":
            metroLabel4.Visible = false;
            metroLabel5.Visible = true;
            metroLabel6.Visible = false;
            metroLabel5.Text = ex.Message;
            break;
        case "Form Name Required":
            metroLabel4.Visible = false;
            metroLabel5.Visible = false;
            metroLabel6.Visible = true;
            metroLabel6.Text = ex.Message;
            break;
        default:
            metroLabel4.Visible = true;
            metroLabel5.Visible = true;
            metroLabel6.Visible = true;
            metroLabel4.Text = "Parent Menu Title Required";
            metroLabel5.Text = "Menu Title Required";
            metroLabel6.Text = "Form Name Required";
            break;
    }