Necessidade lambda OrderBy expressão com a conversão de DateTime
-
06-07-2019 - |
Pergunta
Eu estou tentando criar uma expressão lambda (Linq, C # 3.5) que pode executar um OrderBy em um valor que é do tipo de dados String, mas que na verdade contém um DateTime parse-capazes.
Por exemplo, os valores típicos podem ser "2009/05/12", "2008/01/14", etc.
A cláusula OrderBy abaixo funciona corretamente para ordenação (como se os dados string), mas eu realmente quero para tratar os valores como DateTimes, e executar a classificação por data. (O sortColumn seria algo como "DateCreated".)
List<MyObject> orderedList = unorderedList.OrderBy(p => p.Details.Find(s => s.Name == sortColumn).Value).ToList();
Existe uma maneira de converter os valores no predicado de fazer isso? Qualquer ajuda apreciada!
Solução
Em vez bruto e ineficiente:
List<MyObject> orderedList = unorderedList.OrderBy(p => DateTime.Parse(p.Details.Find(s => s.Name == sortColumn).Value)).ToList();
Para reduzir o número de pesquisas / análise:
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();
Outras dicas
Project a data-valor / hora e, em seguida, ordenar por ele.
var orderedList =
(from p in unorderedList
let value = DateTime.Parse(p.Details.Find(s => s.Name == sortColumn).Value)
orderby value
select p)
.ToList();