Necesita expresión lambda OrderBy con conversión de fecha y hora
-
06-07-2019 - |
Pregunta
Estoy tratando de crear una expresión lambda (Linq, C # 3.5) que pueda realizar un OrderBy en un valor que sea de tipo de datos String pero que en realidad contenga un DateTime analizable.
Por ejemplo, los valores típicos pueden ser "12/12/2009" , "14/01/2008", etc.
La siguiente cláusula OrderBy funciona correctamente para ordenar (como si fueran datos de cadena), pero en realidad quiero tratar los valores como DateTimes y realizar la ordenación por Fecha. (La sortColumn sería algo así como '' dateCreated '').
List<MyObject> orderedList = unorderedList.OrderBy(p => p.Details.Find(s => s.Name == sortColumn).Value).ToList();
¿Hay alguna forma de convertir los valores en el predicado para hacer esto? Cualquier ayuda apreciada!
Solución
Bastante bruto e ineficiente:
List<MyObject> orderedList = unorderedList.OrderBy(p => DateTime.Parse(p.Details.Find(s => s.Name == sortColumn).Value)).ToList();
Para reducir el número de búsquedas / análisis:
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();
Otros consejos
Proyecte el valor de fecha / hora y luego ordene por él.
var orderedList =
(from p in unorderedList
let value = DateTime.Parse(p.Details.Find(s => s.Name == sortColumn).Value)
orderby value
select p)
.ToList();