2012-05-18 52 views
2

我有一個:更清潔的方式來將可空的datetime數組轉換爲可爲空的double?

DateTime?[] dates 

我需要轉換爲:

Double?[] oaDates 

任何方式清理這個班輪?或者我應該只是訴諸功能?

DateTime?[] dates = new DateTime?[]{DateTime.Now, DateTime.Now.AddDays(1), DateTime.Now.AddDays(2)}; //example array 
Double?[] oaDates = dates.Select(t => (t==null)?((double?)null):(t??DateTime.MinValue).ToOADate()).ToArray(); 

我不能叫上噸的方法不檢查它的空(因此第三操作),我有聚結它,以及使我可以調用OADate(因此聚結和填料DateTime.MinValue那永遠不會被擊中)。

它完成了一行中的工作,但它看起來有點像perl一樣。

也許是擴展方法?這樣我可以掩蓋醜陋,只是沿着這樣的方向行事:

dates.ToNullableOADates(); 

回答

3

實際上,你可以致電null引用擴展方法。所以,你可以定義一個擴展方法單一DateTime?轉換爲double?,如:

public static class DateUtil 
{ 
    public static double? ConvertToDouble(this DateTime? date) 
    { 
     return date.HasValue ? date.Value.ToOADate() : (double?)null; 
    } 
} 

然後調用它像:

double?[] oaDates = dates.Select(t => t.ConvertToDouble()).ToArray(); 

但是,你同樣可以使用方法組語法調用它:

double?[] oaDates1 = dates.Select(DateUtil.ConvertToDouble).ToArray(); 
+0

太好了。這正是我所期待的! – dubbreak

+0

如果你要這樣,稱它爲ToOADate :) –

2

不知道爲什麼你有t?

你就不能這樣做......

Double?[] oaDates = 
    dates.Select(t => (t == null) ? (double?)null : t.Value.ToOADate()).ToArray(); 
+0

我真的不知道Value屬性(現在我非常感謝)。沒有它,我需要空合併運算符(??)。 – dubbreak

0
var array = dates.Select(t => t.HasValue ? t.Value.ToOADate() : (double?)null).ToArray(); 
0
dates.Select(t=> t==default(DateTime?) || t.HasValue==false ? (double?)(null):t.Value.ToOADate()).ToArray()