Есть ли эквивалент функции SQL NULLIF в C#?

Есть ли в 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);

5 ответов

Решение

Нет, в настоящее время для этого нет языковой функции.

Вы можете легко получить тот же результат, либо с троичным, если:

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

Принятый ответ дай мне:

Оператор '==' не может быть применен к операндам типа '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));
Другие вопросы по тегам