14

我有两个可以为空的日期时间对象,我想比较两者。最好的方法是什么?

我已经尝试过:

DateTime.Compare(birthDate, hireDate);

这给出了一个错误,也许它期望类型的日期System.DateTime并且我有 Nullable 日期时间。

我也试过:

birthDate > hiredate...

但结果并不如预期......有什么建议吗?

4

8 回答 8

24

要比较两个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)
{
}
于 2013-01-10T06:19:50.070 回答
12

Nullable.Equals指示两个指定的 Nullable(Of T) 对象是否相等。

尝试:

if(birthDate.Equals(hireDate))

最好的方法是:Nullable.Compare 方法

Nullable.Compare(birthDate, hireDate));
于 2013-01-10T06:20:45.533 回答
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);
于 2013-01-10T06:23:27.270 回答
4

使用Nullable.Compare<T>方法。像这样:

var equal = Nullable.Compare<DateTime>(birthDate, hireDate);
于 2013-09-09T08:48:46.410 回答
1

正如@Vishal 所说,只需使用覆盖的Equals方法Nullable<T>。它是这样实现的:

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)
于 2013-01-10T06:25:30.113 回答
1

尝试

birthDate.Equals(hireDate)

比较后做你的事情。

或者,使用

object.equals(birthDate,hireDate)
于 2013-01-10T06:27:02.780 回答
1

我认为您可以通过以下方式使用条件

birthdate.GetValueOrDefault(DateTime.MinValue) > hireddate.GetValueOrDefault(DateTime.MinValue)
于 2013-01-10T06:31:41.477 回答
0

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

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();
于 2015-11-19T08:41:12.027 回答