Сравнить объекты 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();