2009-07-31 10 views
4

J'essaye de créer une expression lambda (Linq, C# 3.5) qui peut effectuer un OrderBy sur une valeur qui est du type de données String mais qui contient en réalité un DateTime parse-able.Besoin d'expression lambda OrderBy avec conversion DateTime

Par exemple, les valeurs typiques peuvent être « 5/12/2009 », « 14/01/2008 », etc.

La clause OrderBy ci-dessous fonctionne correctement pour la commande (comme si les données de chaîne), mais je voulez réellement traiter les valeurs comme DateTimes, et effectuez le tri par Date. (Le sortColumn serait quelque chose comme « dateCreated ».)

List<MyObject> orderedList = unorderedList.OrderBy(p => p.Details.Find(s => s.Name == sortColumn).Value).ToList(); 

est-il un moyen de convertir les valeurs dans le prédicat de le faire? Toute aide appréciée!

Répondre

7

plutôt brut et inefficace:

List<MyObject> orderedList = unorderedList.OrderBy(p => DateTime.Parse(p.Details.Find(s => s.Name == sortColumn).Value)).ToList(); 

Pour réduire le nombre de consultations/analyse syntaxique:

List<MyObject> orderedList = 
    (from extracted in (from p in unorderedList 
         select new { Item = p, Date = DateTime.Parse(p.Details.Find(s => s.Name == sortColumn).Value }) 
    orderby extracted.Date 
    select extracted.Item) 
    .ToList(); 
+3

Quelle est la justification de la première version «grossière et inefficace»? –

1

projet, la valeur de date/heure, puis trier.

var orderedList = 
    (from p in unorderedList 
    let value = DateTime.Parse(p.Details.Find(s => s.Name == sortColumn).Value) 
    orderby value 
    select p) 
    .ToList();