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!

Foi útil?

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top