Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#中是否有与SQL NULLIF函数等价的函数?_C#_.net_Null_Nullif - Fatal编程技术网

c#中是否有与SQL NULLIF函数等价的函数?

c#中是否有与SQL NULLIF函数等价的函数?,c#,.net,null,nullif,C#,.net,Null,Nullif,c#中是否有内置函数的等价物 它可能是什么样子的示例: double? result double denominator = 0; double Numerator = 100; result = Numerator / NullIf(denominator, 0); result = Numerator / denominator.NullIf(0); result = Numerator / Object.NullIf(denominator, 0); 不,但你可以创建一个 public

c#中是否有内置函数的等价物

它可能是什么样子的示例:

double? result
double denominator = 0;
double Numerator = 100;
result = Numerator / NullIf(denominator, 0);
result = Numerator / denominator.NullIf(0);
result = Numerator / Object.NullIf(denominator, 0);

不,但你可以创建一个

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);
}
publicstaticnullablenullif(T-first,T-second),其中T:struct
{
如果(第一个==第二个)
返回新的Nullable();
返回新的可空值(第一个);
}

没有。但您可以使用三元运算符进行紧凑的编写:

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;

不,目前没有这方面的语言功能

您可以很容易地得到相同的结果,如果:

result = Numerator / (denominator == 0 ? (double?)null : denomiantor);
或者甚至将其包装为通用函数,例如:

Nullable<T> NullIf<T>(T left, T right)
{
    return left == right ? (T?)null : left;
}

接受答案给我:

运算符“==”不能应用于“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;
}
publicstatict?NullIf(T左,T右),其中T:struct
{
返回EqualityComparer.Default.Equals(左,右)?(T?)null:左;
}

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

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

public static T? NullIf<T>(this T value, Func<T,bool> isConsideredNull) 
{
        if(value == null)
        {
           return null;
        }
        return isConsideredNull(value) ? (T?)null : value;
}

你的意思是分母可以为NULL,而不是结果,对吗?我的意思是当值为零时除以NULL,只需对结果使用三元运算符<代码>结果=分母==0?(双?)空:编号器/指示器还考虑到双.No在这里的行为类似于SQL NULL,并且不需要NulLable等。1 /NAN= NANN等,我想您正在寻找什么,您可以很容易地添加自己的NaNIf扩展函数。谢谢,请指出这一点。但是,我将坚持使用NULL,因为并非所有类型都有NaN。例如,integer没有NaN。我更喜欢每次都使用相同的模式。它可以工作,但我真的不喜欢对
int?
double?
等进行操作。imho
5/null==null
令人困惑。@Vittor对我来说,如果你认为
null
意味着未知值的话,那就直截了当了。5除以未知值即为未知值。
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));