【问题标题】:Need lambda expression OrderBy with DateTime conversion需要带有 DateTime 转换的 lambda 表达式 OrderBy
【发布时间】:2009-08-01 02:09:32
【问题描述】:

我正在尝试创建一个 lambda 表达式(Linq,C# 3.5),它可以对数据类型 String 但实际上包含可解析的 DateTime 的值执行 OrderBy。

例如,典型值可能是“5/12/2009”、“1/14/2008”等。

下面的 OrderBy 子句可以正确地进行排序(就像字符串数据一样),但我实际上想将值视为 DateTimes,并按 Date 执行排序。 (sortColumn 类似于“dateCreated”。)

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

有没有办法转换谓词中的值来做到这一点?任何帮助表示赞赏!

【问题讨论】:

    标签: c# linq predicate sql-order-by


    【解决方案1】:

    相当粗暴和低效:

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

    减少查找/解析的次数:

    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();
    

    【讨论】:

    • 第一个版本“粗鲁而低效”的理由是什么?
    【解决方案2】:

    投影日期/时间值,然后按它排序。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多