【问题标题】:Using the ternary operator for multiple operations使用三元运算符进行多项操作
【发布时间】:2012-03-25 21:11:24
【问题描述】:

如果表达式为真/假,我如何使用三元? : 条件执行多个操作?

wbsource = (exp) ? (Do one thing) : (Do second thing) wbsource = (exp) ? (Do one thing) (Do second thing) : (Do second thing)

例如:

为什么我不能在?:之间执行三个操作

filename = (fp!=null) ? fp; Properties.Settings.Default.filename=fp; Properties.Settings.Default.Save; : Properties.Settings.Default.file;

使用简单的 if 条件,我会以如下简单的方式编写:

if(fp!null)
{
filename = fp;
Properties.Settings.Default.filename;
Properties.Settings.Default.Save();
}
else
{
filename = Properties.Settings.Default.file
}

使用上述三元运算符编写的简洁的方法是什么?

【问题讨论】:

  • 我喜欢这种情况下的 if / else 方式 - 恕我直言更容易阅读......
  • 一元表示“有一个操作数”。 ? :三个操作数——它是一个三元操作符,它的名字是条件操作符。

标签: c# operators


【解决方案1】:

如果这是c,感谢"comma operator",你会没事的:

int b;
int a = (1==1) ? (b=6, somemethod(), 1) : (b=7, 2);

这里b将被设置为6,somemethod将被调用,然后a被设置为1。

谢天谢地,这是一项未被移植的功能,使用if..else 会更清晰。

【讨论】:

    【解决方案2】:

    简短的回答,使用if 块,这是唯一明智的做法。

    其他答案,给肮脏、臭臭的疯子。

    filename = (fp!=null) ? Func<string> {fp = Properties.Settings.Default.filename; Properties.Settings.Default.Save; return fp;} : Properties.Settings.Default.file; 
    

    【讨论】:

      【解决方案3】:

      条件运算符是三元运算符(不是一元运算符),不能替代if 语句。它是返回两个结果之一的运算符。虽然您可以在某种程度上将其链接起来:

      var result = someBool ? "a" : (otherBool ? "b" : "c");
      

      这有点难以阅读。此外,您正在尝试调用 Save() 函数,该函数不返回结果,因此您不能将其与此运算符一起使用。

      【讨论】:

        【解决方案4】:

        如果你真的,真的想,你可以使用一个有side effects的函数:

        filename = (fp!=null) ? DoOneThing(...) : DoAnotherThing(...);
        

        尽管维护你代码的人不会感谢你。

        【讨论】:

          【解决方案5】:

          为什么我不能在 之间执行三个操作?和:

          因为这些是操作数,它们是表达式。每个表达式计算一个值;你想要多个语句。来自 Eric Lippert 的blog post about foreach vs ForEach

          第一个原因是这样做违反了所有其他序列运算符所基于的函数式编程原则。显然,调用此方法的唯一目的是引起副作用。

          表达式的目的是计算一个值,而不是产生副作用。声明的目的是产生副作用。这个东西的调用点看起来很像一个表达式(虽然,不可否认,由于该方法是返回无效的,所以该表达式只能在“语句表达式”上下文中使用。)

          您绝对应该使用if 块来编写此内容。更清楚了。

          如果你真的,真的想为此使用条件运算符,你可以这样写:

          // Please, please don't use this.
          Func<string> x = () => {
              Properties.Settings.Default.filename = fp;
              Properties.Settings.Default.Save();
              return fp;
          };
          
          string filename = fp == null ? Properties.Settings.Default.file : x();
          

          【讨论】:

          • 为什么不匿名声明函数内联(笑话)
          猜你喜欢
          • 2020-06-13
          • 2012-04-02
          • 1970-01-01
          • 2018-01-02
          • 1970-01-01
          • 2019-04-28
          • 2012-07-24
          • 2012-04-06
          • 1970-01-01
          相关资源
          最近更新 更多