C# 比较可为空的datetime对象

C# 比较可为空的datetime对象,c#,datetime,compare,nullable,C#,Datetime,Compare,Nullable,我有两个可为空的datetime对象,我想比较这两个对象。最好的方法是什么 我已经试过: DateTime.Compare(birthDate, hireDate); 这给出了一个错误,可能它需要类型为System.DateTime的日期,并且我有可为空的datetimes 我也尝试过: birthDate > hiredate... 但是结果并不像预期的那样……有什么建议吗?要比较两个可为空的对象,请使用如下: bool result = Nullable.Compare(birth

我有两个可为空的datetime对象,我想比较这两个对象。最好的方法是什么

我已经试过:

DateTime.Compare(birthDate, hireDate);
这给出了一个错误,可能它需要类型为
System.DateTime
的日期,并且我有可为空的datetimes

我也尝试过:

birthDate > hiredate...

但是结果并不像预期的那样……有什么建议吗?

要比较两个
可为空的
对象,请使用如下:

bool result = Nullable.Compare(birthDate, hireDate) > 0;

您还可以执行以下操作:

使用可为空的DateTime的Value属性。(记住检查两个对象是否都有一些值)

如果两个值都是相同的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)
{
}
指示两个指定的可为空(Of T)对象是否相等

尝试:

最好的办法是:


如果希望将
null
值视为
default(DateTime)
可以执行以下操作:

public class NullableDateTimeComparer : IComparer<DateTime?>
{
    public int Compare(DateTime? x, DateTime? y)
    {
        return x.GetValueOrDefault().CompareTo(y.GetValueOrDefault());
    }
}
另一种方法是为值可比较的
null
类型创建一个扩展方法

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());
    }
}

正如@Vishal所述,只需使用
Nullable
的重写方法。其实施方式如下:

public override bool Equals(object other)
{
    if (!this.HasValue)    
        return (other == null);

    if (other == null)    
        return false;

    return this.value.Equals(other);
}
如果两个可为null的结构都没有值,或者它们的值相等,则返回
true
。所以,简单地使用

birthDate.Equals(hireDate)
试一试

比较之后再做你的事情

或者,使用

object.equals(birthDate,hireDate)

我想你可以用下面的方式使用这个条件

birthdate.GetValueOrDefault(DateTime.MinValue) > hireddate.GetValueOrDefault(DateTime.MinValue)
使用该方法。像这样:

var equal = Nullable.Compare<DateTime>(birthDate, hireDate);
var equal=Nullable.Compare(出生日期,受雇日期);

您可以编写一个通用方法来计算以下任何类型的最小值或最大值:

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();

如果nullable没有值,您将在尝试访问value Property时遇到异常,在每种情况下都将返回哪些整数值,即><==如果其中一个日期为null,.value将为null,并将抛出带有“nullable object必须有值”的InvalidOperationException。OP可能想在其中添加空检查。@lazyberezovsky那么你认为最好的方法是什么?正如我所做的那样,在某些情况下,值可以为null。
var equal=null.Compare(birthDate,hireDate)是否为空<日期?空值和空值呢?当您使用
生日>雇佣日期
时,结果与您预期的结果有什么不同,因为这是最简单的方法。C#引入了提升操作员,使事情变得简单。可能重复
birthDate.Equals(hireDate)
object.equals(birthDate,hireDate)
birthdate.GetValueOrDefault(DateTime.MinValue) > hireddate.GetValueOrDefault(DateTime.MinValue)
var equal = Nullable.Compare<DateTime>(birthDate, hireDate);
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();