2012-01-31 86 views
0

我想制定一個比較兩種類型的DateTime比較乾淨的方式?對象而無需打擾大量的空檢查。比較DateTime的Date屬性?

下面是一個好主意,或者是有一個更簡單或明智的方式去做;

DateTime? test = DateTime.MinValue; 
DateTime? date1 = new DateTime(2008, 6, 1, 7, 47, 0); 

if (string.Format("{0:MM/dd/yyyy}", date1) == string.Format("{0:MM/dd/yyyy}", test)) 
{ 
    Console.WriteLine("They are the same"); 
} 
else 
{ 
    Console.WriteLine("They are different"); 
} 

回答

5

不,使用文本格式來比較簡單值是不是一個好主意IMO。一個選項,以使事情更整潔是寫一個擴展方法,有效地傳播空值(如也許單子):

public static Nullable<TResult> Select<TSource, TResult> 
    (this Nullable<TSource> input, Func<TSource, TResult> projection) 
    where TSource : struct 
    where TResult : struct 
{ 
    return input == null ? (Nullable<TResult>) null : projection(input.Value); 
} 

然後,您可以比較可空類型的預測很容易:

if (date1.Select(x => x.Date).Equals(date2.Select(x => x.Date)) 

甚至添加自己的平等投影法:

public static bool EqualsBy<TSource, TResult> 
    (this Nullable<TSource> x, Nullable<TSource> y, 
    Func<TSource, TResult> projection) 
    where TSource : struct 
    where TResult : struct 
{ 
    return x.Select(projection).Equals(y.Select(projection)); 
} 

和:

if (date1.EqualsBy(date2, x => x.Date)) 

當你真的沒有護理關於文本時,這比執行文本轉換更加靈活和優雅。

+0

我同意你的方法比我的建議更加靈活和優雅。但是,我主要是在尋找一種易於閱讀和維護的解決方案。我喜歡這種擴展方法的思想,並且它足夠通用,可以被Nullable類型使用,但是,在我的小型項目中,它仍然可能僅用於這個實例。只有一種用法的擴展方法(或投影方法)會被視爲超過工程嗎?我不是有意質疑你的方法,我只是在兩方面思考什麼是最好的。注:我不是說我最好:) – 2012-02-01 03:48:12

+0

@MrMoose:我不確定 - 只是*一個*使用我可能還會提取一個方法,但是它只是*用於比較日期。我絕對要麼做到這一點,要麼與明確的空比較 - 我當然不會使用文本格式。 – 2012-02-01 06:27:22

+0

謝謝。你已經說出了我的AWESOME解決方案。對於我目前的情況,我可能最終會使用bvli的例子(修改爲適合),但我喜歡你的方法。 – 2012-02-01 06:33:19

2

出了什麼問題:

bool result = test == date1; 

編輯:對不起 - 沒注意到你只是想日期部分。

bool result; 
if (one.HasValue && two.HasValue) { 
    result = one.Value.Date == two.Value.Date; 
} else { 
    result = one == two; 
} 
+0

+1我喜歡這樣。我沒有意識到Nullable類型允許你訪問它們的屬性,如果它們實際上是空的。我期待空引用錯誤。話雖如此,我喜歡我的例子只有一個條件來推導出結果。即便如此,看來我的解決方案並不是真的被認爲是解決問題的好方法。 – 2012-02-01 03:31:04

+0

感謝您的解決方案,我終於使用了Jon's,結果證明代碼中有更多區域適用。 – 2012-02-02 06:56:16

0

方法一:兩個日期值進行比較(檢查後,如果它已經具有值)

if (test.HasValue && date1.HasValue 
    && test.Value.Date == date1.Value.Date) 
{ 
// your code 
} 

方法2:比較使用的DateTime的CompareTo函數兩個日期(後如果已經檢查有值)

if (test.HasValue && date1.HasValue 
    && date1.Value.Date.CompareTo(test.Value.Date) == 0) 
{ 
// your code 
} 
+1

請注意,如果'test'和'date1'都爲空,這些將會返回false,我不相信這是意圖。 – 2012-01-31 09:47:06