2012-10-01 3 views
2

J'ai un 2 List<DateTime> et je souhaite renvoyer le sous-ensemble de la première liste qui ne figure pas dans la deuxième liste mais ignore l'heure. Est-il possible de faire cela en utilisant la méthode d'extension Except?Linq to Objects DateTime Sauf heure d'ignorance

var missingDates = dateList1.Except(dateList2); 

Est-ce que je dois régler l'heure dans les deux listes à 00:00:00 ou est-il une certaine façon, je peux utiliser la propriété .Date pour comparer?

Répondre

4

Essayez ceci:

var missingDates = dateList1.Select(x=>x.Date).Except(dateList2.Select(y=>y.Date)); 

Bien que cela ne tient pas compte du temps complètement, ce qui signifie que dans votre résultat le temps va manquer aussi ...

Sur une seconde pensée: Vous pouvez bien sûr mettre en œuvre une coutume IEqualityComparer pour préserver le temps dans le résultat:

public class DateComparer : IEqualityComparer<DateTime> 
{ 
    public bool Equals(DateTime left, DateTime right) 
    { 
     return left.Date.Equals(right.Date); 
    } 

    public int GetHashCode(DateTime dateTime) 
    { 
     return dateTime.Date.GetHashCode(); 
    } 
} 

Et puis utiliser ce comparateur:

var missingDates = dateList1.Except(dateList2, new DateComparer()); 
+0

a fait l'affaire ... merci! – woggles

+0

Voir ma réponse modifiée sur la façon de préserver le temps dans le résultat si nécessaire ... – Spontifixus

1

Cela ne tient pas compte du temps dans la comparaison, mais les dates de retour avec des temps intacte:

List<DateTime> missingDates = dateList1.Where(list1Item => !dateList2.Exists(list2Item => list2Item.Date == list1Item.Date)).ToList(); 
+0

Remplacez 'Exists' par' Any' et c'est aussi une réponse valide, aussi. – Spontifixus

+0

@Spontifixus: qu'est-ce qui ne va pas avec Exists ici? Il fait la même chose que tout. – Carl

+0

Vous avez raison Carl - mon erreur était que j'ai essayé avec LINQPad sur deux tableaux. 'Exists (Predicate match)' n'est pas une méthode LINQ, mais plutôt une méthode de la classe 'List ', donc sur mes tableaux qui ne fonctionneront pas. Donc, votre réponse mérite une upvote, aussi;) – Spontifixus