Как я могу округлить тип C # с двойным обнулением?

#c#

#c#

Вопрос:

Я хочу округлить double? значение так, чтобы, если его значение равно 2.3, результат должен быть равен 2, но если входные данные равны null, то результат должен быть нулевым.

Ответ №1:

Нет прямого способа округлить обнуляемый double. Вам нужно проверить, имеет ли переменная значение: если да, округлите его; в противном случае верните null .

Вам нужно выполнить приведение бита, если вы делаете это с помощью условного ?: оператора:

 double? result = myNullableDouble.HasValue
               ? (double?)Math.Round(myNullableDouble.Value)
               : null;
  

В качестве альтернативы:

 double? result = null;
if (myNullableDouble.HasValue)
{
    result = Math.Round(myNullableDouble.Value);
}
  

Комментарии:

1. что ж, оба ответа @dtb и @Eric Lippert великолепны, но мне интересно, какой из них я должен отметить как правильный. У @ dtb более низкая репутация, поэтому его ответ будет отмечен как правильный: D. Но @Eric ваше решение тоже действительно отличное. Спасибо вам обоим. Кстати, этот метод следует добавить в .net 5, есть ли здесь какой-либо список, куда мы можем добавить то, что должно быть добавлено в другой .net freamework?

2. @kosnkov, не основывайте принятие на том, чья репутация выше или ниже, основывайте его на том, чей ответ решил вашу проблему лучше всего. Вы использовали подход dtb или создали метод, подобный Eric? Мы здесь не о том, чтобы уравновесить масштабы, мы о том, чтобы объективно определить ответ, который решил конкретную проблему. Однако, в случае двух идентичных ответов я бы предложил использовать время отправки в качестве тай-брейка, но это только для меня.

3. @Anthony Pegram, приятель, послушай, если оба варианта являются отличными ответами, что я могу сделать? или, как вы сказали, время отправки или что-то еще, в этом случае очень сложно решить, какой из них лучше.

Ответ №2:

Как указывали другие, это достаточно легко сделать одноразово. Чтобы сделать это в целом:

 static Func<T?, T?> LiftToNullable<T>(Func<T, T> func) where T : struct
{
    return n=> n == null ? (T?) null : (T?) func(n.Value);
}
  

И теперь вы можете сказать:

 var NullableRound = LiftToNullable<double>(Math.Round);
double? d = NullableRound(null);
  

И, кстати, теперь вы можете сделать это с помощью любого метода, который принимает и возвращает тип значения.

Ответ №3:

 return d.HasValue ? Math.Round(d.Value) : (double?)null;
  

Комментарии:

1. Близко, но не совсем. Поместите приведение к (double?) к нулю, чтобы исправить это.