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

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 两次,那么你可以创建一个扩展方法(在静态 class 中):

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() 的结果等于您已经知道的值时,则无需再次调用它。您可以 return 您已经知道的值。

但是,通常需要以下内容:

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

但是,您可以将最后一个结构替换为简单的:

object o = LongMethodWithResult() ?? defaultResult;