是否可以在三元表达式上只放置一个选项?

Posted

技术标签:

【中文标题】是否可以在三元表达式上只放置一个选项?【英文标题】: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 代码添加以获取更多信息和进一步讨论/解释。 【参考方案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

【讨论】:

以上是关于是否可以在三元表达式上只放置一个选项?的主要内容,如果未能解决你的问题,请参考以下文章

ng-click中的三元表达式在angularjs中

三元运算符

三元表达式是啥?

js——判断变量是否为空是否包含某属性,三元表达式(要这个)

python学习笔记第九节(迭代器,生成器,三元表达式)

C#中的三元表达式