我正在尝试比较两种类型的DateTime相对干净的方法?对象无需烦扰大量的空检查。
以下是一个好主意,还是有一个更简单或更明智的方法来解决它;
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");
}
答案 0 :(得分:5)
不,使用文本格式来比较简单值是不一个好主意IMO。使事情变得更整洁的一个选择是编写一个扩展方法来有效地传播空值(如monad):
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))
甚至可以添加自己的相等投影方法:</ p>
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))
当你真的不关心文本时,这比执行文本转换更加灵活和优雅。
答案 1 :(得分:2)
出了什么问题:
bool result = test == date1;
编辑:对不起 - 没注意到你只想要日期部分。
bool result;
if (one.HasValue && two.HasValue) {
result = one.Value.Date == two.Value.Date;
} else {
result = one == two;
}
答案 2 :(得分:0)
方法1:比较两个日期值(检查它是否已有值)
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
}