在C#中是否有类似于SQL NULLIF函数的等效函数?

12

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

你的意思是分母应该可为空,而不是结果,对吗? - juharr
当值为零时,我的意思是除以NULL。 - AXMIM
2
只需使用三元运算符来得出结果。result = denominator == 0 ? (double?)null : Numberator/denomiantor; - vittore
还要考虑到double.NaN在这里的行为很像sql null,并且不需要nullables等。1 / NaN = NaN等,这正是您所寻找的,您可以轻松地添加自己的NaNIf扩展函数。 - tolanj
谢谢指出。然而,我会坚持使用NULL,因为并非所有类型都有NaN。例如,整数没有NaN。我更喜欢每次使用相同的模式。 - AXMIM
5个回答

9

目前没有相应的语言功能。

您可以使用三元条件运算符轻松获得相同的结果:

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 是令人困惑的。 - vittore
5
如果您把“null”理解为未知值,那么这对我来说很容易理解。5除以一个未知值仍然是未知值。 - juharr
不值得单独回答,因为您的回答已经可以接受,但它也可以是一个扩展方法,以使其更符合 C# 的风格,尽管它并不完全反映 SQL 变体。public static class Extensions { public Nullable NullIf(this T left, T right) => left == right ? (T?)null : left; } ... result = numerator / denominator.NullIf(0) - William Herrmann

7

接受的答案给了我以下信息:

运算符“==”不能应用于类型为“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;
}

4
不,但你可以创建一个。
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);
}

1

没有,但是你可以使用三元运算符来以更简洁的方式编写它:

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;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接