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

时间:2012-01-25 13:44:05

标签: c# xml linq

我正在处理每日股票市场数据的内存xml,并且其中一个日期的值为“8/221/19055”。我看到TryParse可能是检查有效日期的最佳选择,但MSDN doc似乎对第二个参数“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"));

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

要消除out的{​​{1}}参数,您可以在通用委托中抽象整个解析,例如标准TryParse

Converter<TInput, TOutput>

或者如果您需要使用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<string, string, DateTime>

答案 2 :(得分:1)

Datetime somedate;

if(DateTime.TryParse(datetotest, out somedate)
{

     code for using date goes here

}

答案 3 :(得分:1)

它可以被重构为这样的东西,不需要函数和执行相同工作的更简单的查询:

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