我有两个可以为空的日期时间对象,我想比较两者。最好的方法是什么?
我已经尝试过了:
DateTime.Compare(birthDate, hireDate);
这是一个错误,也许是期望System.DateTime
类型的日期,我有可空的日期时间。
我也尝试过:
birthDate > hiredate...
但结果并不像预期的那样......有什么建议吗?
答案 0 :(得分:20)
要比较两个Nullable<T>
个对象,请使用 Nullable.Compare<T>
,如:
bool result = Nullable.Compare(birthDate, hireDate) > 0;
你也可以这样做:
使用Nullable DateTime的Value属性。 (请记住检查两个对象是否有某些值)
if ((birthDate.HasValue && hireDate.HasValue)
&& DateTime.Compare(birthDate.Value, hireDate.Value) > 0)
{
}
如果两个值都相同DateTime.Compare将返回0
喜欢的东西
DateTime? birthDate = new DateTime(2000, 1, 1);
DateTime? hireDate = new DateTime(2013, 1, 1);
if ((birthDate.HasValue && hireDate.HasValue)
&& DateTime.Compare(birthDate.Value, hireDate.Value) > 0)
{
}
答案 1 :(得分:12)
Nullable.Equals表示两个指定的Nullable(Of T)对象是否相等。
尝试:
if(birthDate.Equals(hireDate))
最好的方法是:Nullable.Compare Method
Nullable.Compare(birthDate, hireDate));
答案 2 :(得分:4)
如果您希望null
值被视为default(DateTime)
,您可以执行以下操作:
public class NullableDateTimeComparer : IComparer<DateTime?>
{
public int Compare(DateTime? x, DateTime? y)
{
return x.GetValueOrDefault().CompareTo(y.GetValueOrDefault());
}
}
并像这样使用
var myComparer = new NullableDateTimeComparer();
myComparer.Compare(left, right);
另一种方法是为价值相当的Nullable
类型制作扩展方法
public static class NullableComparableExtensions
{
public static int CompareTo<T>(this T? left, T? right)
where T : struct, IComparable<T>
{
return left.GetValueOrDefault().CompareTo(right.GetValueOrDefault());
}
}
你可以像这样使用它
DateTime? left = null, right = DateTime.Now;
left.CompareTo(right);
答案 3 :(得分:4)
使用Nullable.Compare<T>
方法。像这样:
var equal = Nullable.Compare<DateTime>(birthDate, hireDate);
答案 4 :(得分:1)
正如@Vishal所述,只需使用Nullable<T>
的覆盖Equals方法。它以这种方式实现:
public override bool Equals(object other)
{
if (!this.HasValue)
return (other == null);
if (other == null)
return false;
return this.value.Equals(other);
}
如果两个可空结构都没有值,或者它们的值相等,则返回true
。所以,只需使用
birthDate.Equals(hireDate)
答案 5 :(得分:1)
Try birthDate.Equals(hireDate) and do your stuff after comparision.
or use object.equals(birthDate,hireDate)
答案 6 :(得分:1)
我认为您可以按以下方式使用该条件
birthdate.GetValueOrDefault(DateTime.MinValue) > hireddate.GetValueOrDefault(DateTime.MinValue)
答案 7 :(得分:0)
您可以编写一个通用方法来计算任何类型的Min或Max:
public static T Max<T>(T FirstArgument, T SecondArgument) {
if (Comparer<T>.Default.Compare(FirstArgument, SecondArgument) > 0)
return FirstArgument;
return SecondArgument;
}
然后使用如下:
var result = new[]{datetime1, datetime2, datetime3}.Max();