2010-07-05 4 views
0

J'ai une collection d'objets et je cherche à trier par une propriété qui est un DateTime?collection d'ordre par date où certains articles n'ont pas de valeur

list.OrderBy(r => r.Milestone) 

où étape est:

public DateTime? Milestone { get; set; } 

il semble mettre tous les éléments avec NoValue au sommet du genre. Est-il possible de trier par date, mais mettre les éléments vides au bas de la liste. (Je ne se soucient de l'ordre des vides bien sûr)

Donc, si j'ai 4 articles:

  1. 1/1/2001
  2. 1/1/2002
  3. [Pas DateTime ]
  4. 1/1/2004

je voudrais commander la liste 1,2,4,3

Répondre

7

Une option facile:

list.OrderBy(r => r.Milestone ?? DateTime.MaxValue) 

Cela ne fonctionnera pas bien s'il sont valeurs avec un mileston de DateTime.MaxValue, bien sûr. Récemment, il y avait une question connexe à propos de l'implémentation IComparer<T> pour mettre des nulls à la fin, mais je ne peux pas le trouver maintenant ... ce qui précède est certainement la solution la plus simple si vous n'utilisez pas MaxValue pour quoi que ce soit autre.

Autre possibilité:

list.OrderBy(r => !r.Milestone.HasValue) 
    .ThenBy(r => r.Milestone) 

ordonnera toutes les valeurs qui ont faire une étape d'abord, puis ceux qui ne le font pas. De cette façon vous travaillerez même si certains jalons utilisent DateTime.MaxValue. C'est un peu plus obscur à mes yeux, mais vous pouvez le préférer.

1

essayez ceci:

list.OrderBy(r => r.Milestone.GetValueOrDefault(DateTime.Maxvalue)) 
Questions connexes