如何在 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要消除TryParse
的out
参数,您可以在通用委托中抽象整个解析,如标准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
【讨论】:
当你将“8/221/19055”传递给它(作为str)时会发生什么? 这只是一个想法,通过泛型委托抽象 TryParse 以消除 out 参数。您可以扩展使用Func<>
传递更多参数并考虑您的业务逻辑分析解析问题【参考方案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?的主要内容,如果未能解决你的问题,请参考以下文章