2012-01-31 88 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