2013-01-10 17 views
9

Ho due oggetti datetime annullabili, voglio confrontarli entrambi. Qual'è il miglior modo di farlo?Confronta oggetti datetime non validi

ho già provato:

DateTime.Compare(birthDate, hireDate); 

Questo sta dando un errore, forse si aspetta date di tipo System.DateTime e ho datetimes Nullable.

Ho anche provato:

birthDate > hiredate... 

Ma i risultati non sono come previsto ... qualche suggerimento?

+0

è nullo zmbq

+0

In che modo i risultati sono diversi da quanto previsto quando si utilizza 'birthDate> hireDate', perché questo è il modo più semplice per farlo. C# ha introdotto ** operatori sollevati ** per semplificare le cose. –

risposta

19

per confrontare due Nullable<T> oggetti utilizzano Nullable.Compare<T> come:

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

È anche possibile fare:

utilizzare la proprietà Value del Nullable DateTime. (Ricordati di controllare se entrambi oggetto ha alcuni valori)

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

Se entrambi i valori sono gli stessi DateTime.Compare tornerà si 0

Something Like

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) 
{ 
} 
+3

Se nullable non ha valore, si otterrà un'eccezione cercando di accedere alla proprietà Value –

+0

Quali valori interi verranno restituiti in ogni caso, cioè><== – faizanjehangir

+0

Se una delle date è nullo, .Valore sarà nullo e verrà generato un'eccezione InvalidOperationException con "Nullable object deve avere un valore". L'OP potrebbe voler aggiungere i controlli Null in là. – ryadavilli

11

Nullable.Equals Indica se due specificati Gli oggetti Nullable (Of T) sono uguali.

Prova:

if(birthDate.Equals(hireDate)) 

Il modo migliore sarebbe: Nullable.Compare Method

Nullable.Compare(birthDate, hireDate)); 
4

Se si desidera un valore null di essere trattati come default(DateTime) si potrebbe fare qualcosa di simile:

public class NullableDateTimeComparer : IComparer<DateTime?> 
{ 
    public int Compare(DateTime? x, DateTime? y) 
    { 
     return x.GetValueOrDefault().CompareTo(y.GetValueOrDefault()); 
    } 
} 

e usalo in questo modo

var myComparer = new NullableDateTimeComparer(); 
myComparer.Compare(left, right); 

Un altro modo per farlo sarebbe quello di rendere un metodo di estensione per Nullable tipi i cui valori sono paragonabili

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

dove occorre utilizzare in questo modo

DateTime? left = null, right = DateTime.Now; 
left.CompareTo(right); 
1

Come @Vishal dichiarato, utilizzare semplicemente il metodo Equals sostituito da Nullable<T>. E 'implementato in questo modo:

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

    if (other == null)  
     return false; 

    return this.value.Equals(other); 
} 

restituisce true se uno sia le strutture nullable non hanno valore, o se i loro valori sono uguali.Quindi, è sufficiente utilizzare

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

Penso che si potrebbe utilizzare la condizione nel modo seguente

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

Utilizzare il metodo Nullable.Compare<T>. Come questo:

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

Sebbene mi piaccia questo metodo, probabilmente intendevi 'var equal = Nullable.Compare (data di nascita, data di assunzione);' :) –

+0

Vero, corretto, grazie. – Maarten

0

è possibile scrivere un metodo generico per calcolare Min o Max per qualsiasi tipo come di seguito:

public static T Max<T>(T FirstArgument, T SecondArgument) { 
    if (Comparer<T>.Default.Compare(FirstArgument, SecondArgument) > 0) 
     return FirstArgument; 
    return SecondArgument; 
} 

Quindi utilizzare come di seguito:

var result = new[]{datetime1, datetime2, datetime3}.Max(); 
Problemi correlati