如何在 xml 数据的 linq 查询中使用 TryParse?

Posted

技术标签:

【中文标题】如何在 xml 数据的 linq 查询中使用 TryParse?【英文标题】:How to I use TryParse in a linq query of xml data? 【发布时间】:2012-02-18 16:41:03 【问题描述】:

我正在处理每日股市数据的内存 xml,并且我得到了其中一个日期的值“8/221/19055”。我看到 TryParse 可能是我检查有效日期的最佳选择,但 MSDN 文档似乎对第二个参数“out DateTime result”的解释很清楚。如何在下面的 linq 查询中使用它?

var makeInfo =
         from s in doc.Descendants("quote")
         where s.Element("LastTradeDate") != null
                && s.Attribute("symbol") != null
         let dateStr = s.Element("LastTradeDate").Value
         where !string.IsNullOrEmpty(dateStr)
                && DateTime.Parse(dateStr, enUS) == targetDate
         select new DailyPricingVolDP((string)s.Attribute("symbol"),
                                      (DateTime)s.Element("LastTradeDate"),
                                      (double)s.Element("Open"),
                                      (double)s.Element("DaysHigh"),
                                      (double)s.Element("DaysLow"),  
                                      (double)s.Element("LastTradePriceOnly"),
                                       (long)s.Element("Volume"));

【问题讨论】:

您是否尝试过先将该输出保存到变量中,然后将您的 linq 中的 2 个日期与 xml 进行比较 @Boomer 谢谢,看起来(或某种形式的逻辑)将成为解决方案,现在通过这些...... 【参考方案1】:
Func<string, DateTime?> tryToGetDate =
        value =>
            
                DateTime dateValue;
                return DateTime.TryParse(value, out dateValue) ? (DateTime?) dateValue : null;
            ;

    var makeInfo =
         from s in doc.Descendants("quote")
         where s.Element("LastTradeDate") != null
                && s.Attribute("symbol") != null
         let dateStr = s.Element("LastTradeDate").Value
         let dateValue = tryToGetDate(dateStr)
         where dateValue != null && (DateTime)dateValue == targetDate
         select .... etc etc

【讨论】:

谢谢..这看起来是实现我的结构方式最直接的方法。 再次查看这一点是您根本不需要尝试解析。只需使用 HasValue: where s.Element("LastTradeDate").HasValue && where s.Element("LastTradeDate") == targetDate 我认为这样做可以让您在查询中释放 let 值跨度> Nullable.HasValue 会起作用。喜欢: ... where dateValue.HasValue && dateValue.Value == targetDate @Andy 我正在努力实现你的修复,谢谢你向我介绍了 Func 类型。【参考方案2】:

要消除TryParseout 参数,您可以在通用委托中抽象整个解析,如标准Converter&lt;TInput, TOutput&gt;

Converter<string, DateTime> converter = (str) =>
                
                    DateTime dateTime;
                    if (!DateTime.TryParse(str, out dateTime))
                    
                       // custom business logic for such cases
                       dateTime = DateTime.MinValue;
                    

                    return dateTime;
                ;

或者如果您需要传入更多参数,请使用Func&lt;string, string, DateTime&gt;,这取决于您,实现(字符串到日期的解析逻辑)也取决于您。

然后在查询中使用:

converter(rawString) == targetDate

【讨论】:

当你将“8/221/19055”传递给它(作为str)时会发生什么? 这只是一个想法,通过泛型委托抽象 TryParse 以消除 out 参数。您可以扩展使用Func&lt;&gt; 传递更多参数并考虑您的业务逻辑分析解析问题【参考方案3】:
Datetime somedate;

if(DateTime.TryParse(datetotest, out somedate)


     code for using date goes here


【讨论】:

谢谢...我是 linq 新手,所以我不知道如何将其合并到我的 var= 语句中。【参考方案4】:

它可以被重构为这样的东西,不需要函数和一个更简单的查询来完成同样的工作:

var makeInfo = from s in doc.Descendants("quote")
    where s.Attribute("symbol").HasValue 
    && s.Element("LastTradeDate").HasValue 
    && DateTime.Parse(Element("LastTradeDate").Value) == targetDate
    select .... etc etc

【讨论】:

你的意思是这就是全部,包括检查错误的日期值吗? 您的 xml 是否有一个架构,它验证它反对声明 LastTradeDate 是一个日期,在这种情况下您知道它将是一个有效日期?

以上是关于如何在 xml 数据的 linq 查询中使用 TryParse?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 linq-to-xml 查询简化此功能?

如何/我可以使用 linq to xml 以合理的内存消耗查询巨大的 xml 文件?

如何使用linq获取表中值的计数

LINQ学习笔记

使用 LINQ 和 XElement 查询 SQL 表

LINQ to XML概述