如何在LINQ语句中使用DateTime.TryParseExact

麦考特

给定以下源数据:

Dim inputs = {New With {.Name="Bob", .Date="201405030500"},
              New With {.Name="Sally", .Date="201412302330"},
              New With {.Name="Invalid", .Date="201430300000"}}

我编写了以下LINQ查询(目的是Where success在之前添加一个子句作为过滤器Select,但我将其省略,并包含success在结果中以进行调试):

Dim result1 = From i in inputs
              Let newDate = New DateTime
              Let success = DateTime.TryParseExact(i.Date, "yyyyMMddHHmm", Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.AssumeLocal, newDate)
              Select New With {
                  .Name = i.Name, 
                  .Success = success,
                  .Date = newDate
              }

但是,我得到以下结果,并newDate没有填充TryParseExact

没有解析日期的结果

因此,我重构了查询以将提取TryParseExact到匿名方法中以获取以下信息:

Dim parseDate = Function(d As String)
                    Dim parsedDate As DateTime
                    Return New Tuple(Of Boolean, Date)(DateTime.TryParseExact(d, "yyyyMMddHHmm", Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.AssumeLocal, parsedDate), parsedDate)
                End Function

Dim result2 = From i in inputs
              Let parsedDate = parseDate(i.Date)
              Select New With {
                  .Name = i.Name,
                  .Success = parsedDate.Item1,
                  .Date = parsedDate.Item2
              }

...这正确地给了我:

具有已解析日期的结果

但是,我想找到一种完全在LINQ语句中完成此操作的方法,而无需使用匿名方法创建元组。当然,我有一些行之有效的方法,但我希望以此为学术兴趣。

我怀疑这是可能的,但我的问题是:

为什么result1查询没有正确设置newDate解析日期?

(我考虑过懒惰的评估,但我认为它不适用于这里。)

更新:

  • 感谢哈姆雷特(Hamlet)向我展示,您实际上可以同时声明和调用匿名方法!心灵=吹!
  • 谢谢Jim建议使用Nullable而不是Tuple!很有道理。
  • 谢谢艾哈迈德建议关闭,对我来说,这肯定比匿名方法干净。

由于以下答案,我将LINQ重构如下(包括Where子句过滤器):

Dim result3 = From i in inputs
              Let parsedDate = Function(d) 
                                   Dim dtParsed As DateTime
                                   Return If(DateTime.TryParseExact(d, "yyyyMMddHHmm", Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.AssumeLocal, dtParsed), dtParsed, New DateTime?)
                               End Function(i.Date)
              Where parsedDate.HasValue
              Select New With {
                  .Name = i.Name,
                  .Date = parsedDate.Value
              }

具有已解析日期的结果

这样可以达到我想要的目的,并且我相信编译器可以优化生成的代码,但是我仍然想确切地了解为什么result1不起作用。也许这是埃里克·利珀特(Eric Lippert)或约翰·斯基特(John Skeet)的问题。

他感觉

我建议您使用TryParsers库,该库是专门为TryParse在LINQ查询中使用方法而创建的

Dim query = From i In inputs
    Let d = TryParsers.TryParse.DateTimeExact(i.Date, "yyyyMMddHHmm", Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.AssumeLocal)
    Select New With {
          .Name = i.Name,
          .Success = Not d Is Nothing,
          .Date = d.Value
    }

您不能将范围变量(let)用作ref / out参数,因为let关键字创建了一个只读变量(实际上它会编译为匿名对象的属性)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TryParseExact失败,出现DateTime

来自分类Dev

DateTime TryParseExact和填充

来自分类Dev

DateTime.TryParseExact错误结果

来自分类Dev

DateTime.TryParseExact返回false

来自分类Dev

DateTime.TryParseExact返回false

来自分类Dev

DateTime.TryParseExact不返回正确的响应

来自分类Dev

DateTime.TryParseExact()返回混合结果

来自分类Dev

C#DateTime.TryParseExact弄错了时区

来自分类Dev

DateTime.TryParseExact一秒

来自分类Dev

使用DateTime.TryParseExact进行模式匹配防护?

来自分类Dev

DateTime TryParseExact是否无法解析相似的字符串?

来自分类Dev

DateTime.TryParseExact增加一分钟?

来自分类Dev

我的DateTime.TryParseExact()逻辑拒绝有效格式

来自分类Dev

DateTime.TryParseExact增加一分钟?

来自分类Dev

我的DateTime.TryParseExact()逻辑拒绝有效格式

来自分类Dev

DateTime TryParseExact是否无法解析相似的字符串?

来自分类Dev

TryParseExact "yyyyMdhhmmss"

来自分类Dev

DateTime.TryParseExact无法与预期的字符串一起使用

来自分类Dev

DateTime TryParseExact一个包含3个字母月份的字符串

来自分类Dev

为什么DateTime.TryParseExact()为这些输入字符串返回不同的时区?

来自分类Dev

DateTime.TryParseExact C#有效格式和解析

来自分类Dev

当作为提供者传递给DateTime.TryParseExact时,“ null”是什么意思?

来自分类Dev

如何在LINQ语句中使用扩展方法?

来自分类Dev

如何处理 TimeSpan.TryParseExact(...) 中的格式说明符

来自分类Dev

带有TryParseExact的FormatException

来自分类Dev

DateTime.TryParse()和DateTime.TryParseExact()无法在Linux / macos上解析日期,并且无法在Windows上正常工作

来自分类Dev

DateTime.TryParseExact无法在Windows 7上解析特定日期,但在Windows 10上有效

来自分类Dev

如何在if语句中使用grep?

来自分类Dev

如何在if语句中使用REGEX

Related 相关文章

  1. 1

    TryParseExact失败,出现DateTime

  2. 2

    DateTime TryParseExact和填充

  3. 3

    DateTime.TryParseExact错误结果

  4. 4

    DateTime.TryParseExact返回false

  5. 5

    DateTime.TryParseExact返回false

  6. 6

    DateTime.TryParseExact不返回正确的响应

  7. 7

    DateTime.TryParseExact()返回混合结果

  8. 8

    C#DateTime.TryParseExact弄错了时区

  9. 9

    DateTime.TryParseExact一秒

  10. 10

    使用DateTime.TryParseExact进行模式匹配防护?

  11. 11

    DateTime TryParseExact是否无法解析相似的字符串?

  12. 12

    DateTime.TryParseExact增加一分钟?

  13. 13

    我的DateTime.TryParseExact()逻辑拒绝有效格式

  14. 14

    DateTime.TryParseExact增加一分钟?

  15. 15

    我的DateTime.TryParseExact()逻辑拒绝有效格式

  16. 16

    DateTime TryParseExact是否无法解析相似的字符串?

  17. 17

    TryParseExact "yyyyMdhhmmss"

  18. 18

    DateTime.TryParseExact无法与预期的字符串一起使用

  19. 19

    DateTime TryParseExact一个包含3个字母月份的字符串

  20. 20

    为什么DateTime.TryParseExact()为这些输入字符串返回不同的时区?

  21. 21

    DateTime.TryParseExact C#有效格式和解析

  22. 22

    当作为提供者传递给DateTime.TryParseExact时,“ null”是什么意思?

  23. 23

    如何在LINQ语句中使用扩展方法?

  24. 24

    如何处理 TimeSpan.TryParseExact(...) 中的格式说明符

  25. 25

    带有TryParseExact的FormatException

  26. 26

    DateTime.TryParse()和DateTime.TryParseExact()无法在Linux / macos上解析日期,并且无法在Windows上正常工作

  27. 27

    DateTime.TryParseExact无法在Windows 7上解析特定日期,但在Windows 10上有效

  28. 28

    如何在if语句中使用grep?

  29. 29

    如何在if语句中使用REGEX

热门标签

归档