简体   繁体   中英

How to I use TryParse in a linq query of xml data?

I'm working with in memory xml of daily stock market data, and I'm getting the value "8/221/19055" for one of the dates. I see that TryParse is likely my best bet to check for a valid date, but the MSDN doc seems light on an explanation of the 2nd parameter "out DateTime result." How can I use it in my linq query below?

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

To eliminate out parameter of TryParse you can abstract entire parsing in the generic delegate like standard 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;
                };

or in case you need passing in more parameters use Func<string, string, DateTime> , it is up to you, implementation (string to date parsing logic) is up to you as well.

Then use in the query:

converter(rawString) == targetDate
Datetime somedate;

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

     code for using date goes here

}

It could be refactored to something like this with no need for functions and a simpler query which does the same job:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM