使用条件运算符的简洁方法
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;
我有这段代码,其中 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;