Как использовать 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