Сравнить объекты datetime с нулевым значением

у меня есть два объекта datetime nullable, я хочу сравнить оба. Как лучше всего это сделать?

Я уже попробовал:

DateTime.Compare(birthDate, hireDate);

Это дает ошибку, возможно, он ожидает даты типа System.DateTime и у меня есть Nullable datetimes.

Я тоже пробовал:

birthDate > hiredate...

но результаты не как ожидалось...есть предложения?

8 ответов


сравнить два Nullable<T> использовать объекты Nullable.Compare<T> как:

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

вы также можете сделать:

используйте свойство Value параметра Nullable DateTime. (не забудьте проверить, имеют ли оба объекта некоторые значения)

if ((birthDate.HasValue && hireDate.HasValue) 
    && DateTime.Compare(birthDate.Value, hireDate.Value) > 0)
{
}

если оба значения одинаковы DateTime.Сравнить вернет вам 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)
{
}

значение null.Равно указывает, равны ли два указанных объекта Nullable(of T).

попробуй:

if(birthDate.Equals(hireDate))

лучшим способом было бы:значение null.Сравнить Метод

Nullable.Compare(birthDate, hireDate));

если вы хотите 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);

использовать Nullable.Compare<T> метод. Вот так:

var equal = Nullable.Compare<DateTime>(birthDate, hireDate);

Try birthDate.Equals(hireDate) and do your stuff after comparision.
or use object.equals(birthDate,hireDate)

как заявил @Vishal, просто используйте overriden равна метод 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 если обе nullable структуры не имеют значения или если их значения равны. Итак, просто используйте

birthDate.Equals(hireDate)

Я думаю, вы могли бы использовать условие следующим образом

birthdate.GetValueOrDefault(DateTime.MinValue) > hireddate.GetValueOrDefault(DateTime.MinValue)

вы можете написать общий метод для расчета 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();