【问题标题】:How to I use TryParse in a linq query of xml data?如何在 xml 数据的 linq 查询中使用 TryParse?
【发布时间】: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 谢谢,看起来(或某种形式的逻辑)将成为解决方案,现在通过这些......

标签: c# xml linq


【解决方案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 是一个日期,在这种情况下您知道它将是一个有效日期?
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2013-08-11
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多