繁体   English   中英

使用条件运算符的简便方法

[英]Concise way of using conditional operator

我有以下代码,其中LongMethodWithResult是需要很长时间才能运行的方法:

object o = LongMethodWithResult() == someVal ? LongMethodWithResult() : someOtherResult;

现在, LongMethodWithResult方法被评估了两次,不是吗?

我知道我可以编写一个使用变量存储long方法结果的方法,如下所示:

public static object ConciseConditionalOperator(object a, object b, object c)
{
    return a == b ? a : c;
}

但是我将对是否有最佳的方法或者C#或.NET提供的某些功能感兴趣。

任何想法都欢迎!

在这种情况下,您可以使用:

object o = LongMethodWithResult() == someVal ? someVal : someOtherResult;


如果您希望使用其他表示法,或者要避免两次指定someVal ,则可以创建一个Extension方法(在静态类中):

public static T IfEqualThenElse<T>(this T valueToCheck, T value1, T value2)
    where T : System.IEquatable<T>
{
    return valueToCheck.Equals(value1) ? value1 : value2;
}

用法:

var o = LongMethodWithResult().IfEqualThenElse(someVal, someOtherResult);

通常你是对的。 在您的示例中, LongMethodWithResult被执行两次。 为了避免这种情况,您需要首先存储LongMethodWithResult的结果:

var result = LongMethodWithResult();
object o = result == someVal ? result : someOtherResult;

正如Peter B在回答中所说的那样,您提供的示例是一个特殊情况,不需要它,因为当LongMethodWithResult()的结果等于您已经知道的值时,就无需再次调用它。 您可以只返回您已经知道的值。

但是,通常需要执行以下操作:

var result = LongMethodWithResult();
object o = result == null ? defaultResult : result;

但是,您可以使用以下简单的方法替换最后一个结构:

object o = LongMethodWithResult() ?? defaultResult;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM