2012-01-25 26 views
10

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

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")); 
+1

有你试着将输出保存到一个变量中,然后比较urlinq中的两个日期到xml – Boomer

+0

@Boomer谢谢,它看起来像(或某种形式的逻辑)将是解决方案,现在通过这些.. – StatsViaCsh

回答

11
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 
+0

谢谢..看起来是最直接的实现我有事情结构的方式。 – StatsViaCsh

+0

再次看到这一点是,你根本不需要尝试解析。只要使用HasValue: –

+1

其中s.Element(“LastTradeDate”)。HasValue &&其中s.Element(“LastTradeDate”)== targetDate我认为这样做,所以你可以在查询 –

1
Datetime somedate; 

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

    code for using date goes here 

} 
+0

谢谢...我是linq的新手,所以我不确定如何将它融入到我的var =语句中。 – StatsViaCsh

3

为了消除TryParseout参数,你可以在泛型委托像标准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>,它是直到你,实现(字符串到日期解析逻辑)也取决于你。

然后在查询中使用:

converter(rawString) == targetDate 
+1

当你通过“8/221/19055”(如str)时,会怎么做? – DOK

+1

这只是一个想法,通过泛型委托对TryParse进行抽象以消除参数。您可以扩展使用'Func <>'传递更多参数,并根据业务逻辑分析解析问题 – sll

+0

@sll好主意,非常感谢。 – StatsViaCsh

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 
+1

你的意思是它的全部,包括检查错误的日期值? – StatsViaCsh

+0

你的xml是否有一个模式,它是验证反对说明LastTradeDate是一个日期,在这种情况下,你知道这将是一个有效的日期? –