【问题标题】:How To Use Nested Ternary Operator In C#?如何在 C# 中使用嵌套三元运算符?
【发布时间】:2018-01-20 16:21:42
【问题描述】:

这里我使用了 if , else if 条件来显示错误消息并使某些标签可见和不可见,但我正在尝试使用三元运算符来这样做,但我对三元运算符非常不熟悉,无法将其用于我的 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";
            }
        }

【问题讨论】:

  • 所以先熟悉一下吧。 SO 不是免费的编码/教程请求服务。
  • @user202729 确实是朋友

标签: c# operators ternary


【解决方案1】:

三元运算符不适合您的问题。它用于根据谓词将一个变量的值设置为两个值之一:

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 语句:

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

【讨论】:

    【解决方案2】:

    您的代码相当于:

    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类型为bool的属性,可以直接赋值逻辑表达式的结果。

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


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

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

    相当于

    string t;
    if (x == 1) {
        t = "case 1";
    } else if (x == 2) {
        t = "case 2";
    } else if (x == 3) {
        t = "case 3";
    } else {
        t = "other case";
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 2011-10-29
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2013-08-19
      相关资源
      最近更新 更多