2011-05-26 24 views

回答

17

沒有直接的方法來輪可空雙。您需要檢查變量是否有值:如果是,請將其舍入;否則,返回null

你需要的,如果你做到這一點使用條件?:運營蒙上了一點:

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

或者:

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

以及@dtb和@Eric Lippert的答案都很好,但我想知道我應該標記爲正確答案。 @dtb具有較低的聲譽,因此他的答案將被標記爲正確的答案:D。但@Eric你的解決方案也非常棒。謝謝你們兩位。順便說一句,這個方法應該被添加到.net 5,有沒有任何列表可以添加什麼shoudl被添加到另一個.net freamework? – kosnkov 2011-05-26 18:14:37

+1

@kosnkov,不要根據誰的代表接受程度更高或更低,根據誰的答案解決您的問題最好。你用dtb的方法去創造一個像Eric這樣的方法嗎?我們不是在平衡這裏的規模,而是在客觀上找出解決具體問題的答案。然而,在兩個*相同*的答案中,我建議使用提交時間作爲決勝者,但這只是我。 – 2011-05-26 18:39:19

+0

@Anthony Pegram,夥伴聽着,如果兩個都很好,我該怎麼辦?或者你說的時間提交或其他任何事情,在這種情況下很難決定哪一個更好。 – kosnkov 2011-05-26 18:54:57

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

關閉,但不完全。把一個強制轉換(null)來修復它。 – 2011-05-26 17:37:37

20

正如其他人所指出的那樣,很容易夠到這樣做是一次性的。要做到這一點一般:

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

哎,現在你可以用做任何方法,它並返回值類型。

+1

給男人一條魚,教一個男人去釣魚。 – 2011-05-26 17:48:53