如何在xml数据的linq查询中使用TryParse?
我正在处理每日股票市场数据的内存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"));
Func 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
要消除TryParse
参数,您可以抽象generics委托中的整个解析,如标准Converter
:
Converter converter = (str) => { DateTime dateTime; if (!DateTime.TryParse(str, out dateTime)) { // custom business logic for such cases dateTime = DateTime.MinValue; } return dateTime; };
或者如果您需要传递更多参数,请使用Func
,这取决于您,实现(字符串到日期解析逻辑)也取决于您。
然后在查询中使用:
converter(rawString) == targetDate
Datetime somedate; if(DateTime.TryParse(datetotest, out somedate) { code for using date goes here }
它可以重构为这样的东西,不需要函数和更简单的查询,它可以完成相同的工作:
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