8

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);
4

5 回答 5

7

不,目前没有针对此的语言功能。

您可以轻松获得相同的结果,或者使用三元 if:

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);
于 2015-08-27T15:47:02.790 回答
5

接受的答案给我:

运算符“==”不能应用于“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;
}
于 2017-05-03T07:35:37.957 回答
3

不,但你可以创建一个。

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);
}
于 2015-08-27T15:41:16.027 回答
0

为什么我们假设这个扩展方法能够知道在我们的上下文中什么是空的。

它是调用它的上下文的责任。因此,说只有一个值将被视为 null 是错误的,因为该线程中的所有响应都暗示。

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));
于 2017-06-05T17:32:35.437 回答
0

没有。但是您可以使用三元运算符来紧凑地编写它:

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;
于 2015-08-27T15:45:41.367 回答