更清洁的方式将可空的日期时间转换为可以为空的双倍?

时间:2012-05-18 04:50:45

标签: c# .net nullable

我有一个:

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

我不能在t上调用方法而不检查它是否为null(因此是第三运算符)并且我必须合并它以便我可以调用OADate(因此合并和填充DateTime.MinValue永远不会命中)。

它可以在一行中完成工作,但它看起来有点像perl。

也许是一种扩展方法?这样我就可以隐藏丑陋,只是按照以下方式做点什么:

dates.ToNullableOADates();

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

不确定你为什么会这样做?

你不能这么做......

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

答案 2 :(得分:0)

var array = dates.Select(t => t.HasValue ? t.Value.ToOADate() : (double?)null).ToArray();

答案 3 :(得分:0)

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