【问题标题】:Is it possible to put only one option on a ternary expression?是否可以在三元表达式上只放置一个选项?
【发布时间】:2016-07-04 22:43:29
【问题描述】:

我只是好奇这是否可能,或者有没有办法让它成为 C# 的有效语法:

expression == value ? /*do nothing here, or put some empty block like { ; } */ : SomeClass.SomeMethod();

编辑:对于深入讨论和更多信息,我认为这个块可以工作(如果测试的字典键不存在,它会添加字典。否则,它会跳过):

(!packageDict.ContainsKey(desc)) ? packageDict.Add(desc, subtotal) : /*does nothing*/;

【问题讨论】:

  • 不,这是不可能的。使用if 语句来做到这一点......另一种选择是使用“默认”值或简单地返回两个结果之一。
  • @Ian 这可能是一个答案,顺便说一句。
  • 你必须返回一些东西,可能是value本身,默认值等等。
  • 为什么需要它?解释要求(通过提供更多代码).. 可能有一些棘手的方法!
  • @Moumit 代码添加以获取更多信息和进一步讨论/解释。

标签: c# dictionary syntax conditional ternary-operator


【解决方案1】:

通过查看您的代码 sn-p,在这里使用三元运算根本没有意义。

你能做的只有:

if (!packageDict.ContainsKey(desc))
    packageDict.Add(desc, subtotal)

【讨论】:

  • 正是我所做的修复它。谢谢!
【解决方案2】:

不,这是有道理的。 expression 在您的无操作操作中会是什么? null?和原来一样吗?编译器应该怎么知道?

例如,这将使变量未设置。这里的expression 是什么?

var expression == value ? : SomeClass.SomeMethod();

只要明确你的期望,要么这样:

expression == value ? null : SomeClass.SomeMethod();

expression == value ? default(Expression) : SomeClass.SomeMethod();

或者当value 为真时保持变量相同:

expression == value ? expression : SomeClass.SomeMethod();

if (!value) expression = SomeClass.SomeMethod();

【讨论】:

    【解决方案3】:

    您应该使用IF 语句(它也是最易读的选项)。

    另一种方法是对您的类型使用默认值(例如,null 用于引用类型,default(value_type) 用于值类型。例如:

    expression == value ? (int?) null : SomeClass.SomeMethod();
    

    【讨论】:

      【解决方案4】:

      这是不可能的,而且意义不大。

      三元运算符应该根据条件返回一个值。这个非常重要。你可以这样对待它:

      public static SomeType TernaryOperator<T>(Predicate<T> condition) {
          if (condition()) {
              return something;
          } else {
              return somethingElse;
          }
      }
      

      所以如果你删除return something 部分,代码会编译吗?答案无疑是否定的。如果条件为真,该方法将返回什么

      同样的事情也适用于三元运算符。如果条件计算为真,整个表达式将返回什么?未定义!

      事实上,一开始就有这个想法是很奇怪的。你为什么想这么做?您可以只使用 if 语句。

      if (condition) {
          // do nothing
      } else {
          //something
      }
      

      当然,你总是可以这样做:

      if (!condition) {
          // something
      }
      

      删除无用的花括号。

      下次遇到这种情况,用if语句就行了。比较合适。

      【讨论】:

        【解决方案5】:

        棘手的方法!!

        根据评论部分的讨论

        这是使用Dictionary 时非常基本的要求.. 您需要检查这些类型的逻辑测试可能多次.. 所以我建议您写一些extension methods 可以使程序窒息..

        public static class Extended
        {
            public static void AddKeyIfNotExists<T, V>(this IDictionary<T,V> dictionary, T key, V Value)
            {
                if (!dictionary.ContainsKey(key))
                {
                    dictionary.Add(key, Value);
                }             
            }
        }
        

        稍后你可以在你的program seamlessly 中使用它

        Dictionary<string,decimal> packageDict= new Dictionary<string,decimal>();
        
        packageDict.AddKeyIfNotExists("demoKey",500);//will add in dictionary
        packageDict.AddKeyIfNotExists("demoKey1", 200);//will add in dictionary
        packageDict.AddKeyIfNotExists("demoKey", 6);//will not add in dictionary
        

        【讨论】:

          猜你喜欢
          • 2010-10-17
          • 2013-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多