在C#内置的函数中,是否有类似于SQL NULLIF功能的等价物?
以下是一个示例:
double? result
double denominator = 0;
double Numerator = 100;
result = Numerator / NullIf(denominator, 0);
result = Numerator / denominator.NullIf(0);
result = Numerator / Object.NullIf(denominator, 0);
在C#内置的函数中,是否有类似于SQL NULLIF功能的等价物?
以下是一个示例:
double? result
double denominator = 0;
double Numerator = 100;
result = Numerator / NullIf(denominator, 0);
result = Numerator / denominator.NullIf(0);
result = Numerator / Object.NullIf(denominator, 0);
目前没有相应的语言功能。
您可以使用三元条件运算符轻松获得相同的结果:
result = Numerator / (denominator == 0 ? (double?)null : denomiantor);
或者将其包装为通用函数,例如:
Nullable<T> NullIf<T>(T left, T right)
{
return left == right ? (T?)null : left;
}
然后可以这样调用:
result = Numerator / NullIf(denominator, 0);
int?
、double?
等上进行操作。在我看来,5/null == null
是令人困惑的。 - vittorepublic static class Extensions
{
public Nullable NullIf(this T left, T right) => left == right ? (T?)null : left;
}
...
result = numerator / denominator.NullIf(0)
- William Herrmann接受的答案给了我以下信息:
运算符“==”不能应用于类型为“T”和“T”的操作数
我的NULLIF工作示例:
public static T? NullIf<T>(T left, T right) where T : struct
{
return EqualityComparer<T>.Default.Equals(left, right) ? (T?)null : left;
}
public static Nullable<T> NullIf<T>(T first, T second) where T : struct
{
if(first == second)
return new Nullable<T>();
return new Nullable<T>(first);
}
没有,但是你可以使用三元运算符来以更简洁的方式编写它:
double? result
double denominator = 0;
double Numerator = 100;
result = denominator == 0 ? (double?)null : Numerator / denominator;
然而,IFNULL 有等效的函数:
result = x ?? 0;
的等效物:
result = x.HasValue? x.Value : 0;
我们为什么假定这个扩展方法能够知道我们上下文中的空值。
调用它的上下文有责任处理它。因此,仅将一个值视为空值是错误的,正如本线程中所有响应都暗示的那样。
public static T? NullIf<T>(this T value, Func<T,bool> isConsideredNull)
{
if(value == null)
{
return null;
}
return isConsideredNull(value) ? (T?)null : value;
}
string test = "NULL";
test.NullIf((x)=> x.Equals("NULL"));
test.NullIf((x)=> x == "NULL");
test.NullIf((x)=> x.Equals("NULL",StringComparison.InvariantCultureIgnoreCase));
result = denominator == 0 ? (double?)null : Numberator/denomiantor;
- vittore