Есть ли эквивалент функции 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));