Как использовать TryParse в запросе linq xml-данных?
Я работаю в памяти xml ежедневных данных на фондовом рынке, и я получаю значение "8/221/19055" для одной из дат. Я вижу, что TryParse, скорее всего, лучший выбор для проверки действительной даты, но документ MSDN кажется легким для объяснения второго параметра "выход из результата DateTime". Как я могу использовать его в моем 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"));
Ответы
Ответ 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
Ответ 2
Чтобы исключить параметр out
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>
, это зависит от вас, реализация (логика синтаксического анализа строки до даты) также зависит от вас.
Затем используйте в запросе:
converter(rawString) == targetDate
Ответ 3
Datetime somedate;
if(DateTime.TryParse(datetotest, out somedate)
{
code for using date goes here
}
Ответ 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