如何在C#中使用嵌套的三元运算符?

时间:2018-01-20 16:21:43

标签: c# operators ternary

这里我使用if,否则如果条件显示错误消息并使某些标签可见且不可见,但我试图使用三元运算符这样做但我对ternery运算符并不熟悉并且无法使用它我在if else代码中的所有条件。
因此,我的代码的任何帮助将受到高度赞赏。谢谢。

以下是我的代码

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

2 个答案:

答案 0 :(得分:1)

您的代码相当于:

const string ParMnuTitReq ="Parent Menu Title Required";
const string MnuTitReq ="Menu Title Required";
const string FrmNamReq ="Form Name Required";

string m = ex.Message;
metroLabel4.Visible =  m != MnuTitReq && m != FrmNamReq;
metroLabel5.Visible = m != ParMnuTitReq && m != FrmNamReq;
metroLabel6.Visible = m != ParMnuTitReq && m != MnuTitReq;

// This can be done in the form designer
metroLabel4.Text = ParMnuTitReq;
metroLabel5.Text = MnuTitReq;
metroLabel6.Text = FrmNamReq;

你不需要三元表达。相反,您可以组合逻辑表达式。对于类型为Visible的{​​{1}}属性,您可以直接分配逻辑表达式的结果。

您始终可以为标签指定相同的文字,因为如果文字不适用,它们将无法显示。您甚至可以删除最后3个代码行,而是在表单设计器中分配文本。这会将原来的23行代码(不包括仅带括号的行)减少到7。

如果您必须能够分配2个以上的不同值,则可以使用嵌套或链接的三元表达式。

bool

相当于

string t = x == 1 ? "case 1" : x == 2 ? "case 2" : x == 3 ? "case 3" : "other case";

答案 1 :(得分:0)

三元运算符不适合您的问题。它用于根据谓词:

将一个变量的值设置为两个值之一
var thingToSet = predicateA ? 
                 ifPredicateAIsTrue : 
                 ifPredicateAIsFalse;

这与:

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

要嵌套三元表达式,请在要设置的值中放置一个新的三元表达式:

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

这相当于:

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

正如您所看到的,这并不适合您的问题,因为您正在尝试根据异常消息设置多个变量的值。

更适合您的问题的是切换声明:

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