2012-05-18 3 views
2

나는이 :nullable datetime의 배열을 nullable 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(); 
I 그것은 널이다 (따라서 급 조작)과 내가 OADate를 호출 할 수 있도록도를 병합 할 필요가 있는지를 확인하지 않고 t에서 메소드를 호출 할 수

(따라서 병합 필러 DateTime.MinValue 그것은 결코 부딪치지 않을 것이다).

작업은 한 줄로 처리되지만 약간의 펄을 닮은 것처럼 보입니다.

확장 메서드가 있습니까? 그런 식으로 나는 추악함을 숨길 수 있으며, 다음의 라인을 따라 무언가를 할 수 있습니다.

dates.ToNullableOADates(); 

답변

3

실제로 null 참조에 확장 메서드를 호출 할 수 있습니다 ... 할 수 없습니다. 그런 다음 전화

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

좋아 : 그래서 당신은 double? 같이가 하나의 DateTime?을 변환하는 확장 메서드를 정의 할 수 그러나

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 속성에 대해 몰랐습니다 (지금은 감사드립니다). 그것 없이는 null-coalescing 연산자 (??)가 필요했습니다. – 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() 
관련 문제