2012-01-25 12 views
10

Pracuję w pamięci xml codziennych danych giełdowych, a otrzymuję wartość "8/221/19055" dla jednej z dat. Widzę, że TryParse jest prawdopodobnie najlepszym rozwiązaniem, jeśli chodzi o sprawdzenie poprawnej daty, ale dokument MSDN wydaje się lekki w kwestii wyjaśnienia drugiego parametru "out DateTime result". Jak mogę użyć tego w poniższym zapytaniu linq?Jak korzystać z TryParse w zapytaniu linq o dane xml?

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

mieć Próbowałeś najpierw zapisać to wyjście w zmiennej, a następnie porównać 2 daty w ur linq do xml – Boomer

+0

@Boomer Dzięki, wygląda na to (lub jakaś forma tej logiki) będzie rozwiązaniem, przechodząc przez te teraz .. – StatsViaCsh

Odpowiedz

11
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 
+0

Dzięki ... to wygląda na najprostszą drogę do wdrożenia sposobu, w jaki mam strukturę. – StatsViaCsh

+0

Jedną z rzeczy, która się nad tym zastanawia, jest to, że nie potrzebujesz w ogóle sparsować try. Po prostu użyj HasValue: –

+1

gdzie s.Element ("LastTradeDate") HasValue && where s.Element ("LastTradeDate") == targetDate Myślę, że to by to zrobiło, abyś mógł stracić wartości let w zapytaniu –

1
Datetime somedate; 

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

    code for using date goes here 

} 
+0

Dzięki ... Jestem nowy w Linq, więc nie jestem pewien jak włączyć to do mojej instrukcji var =. – StatsViaCsh

3

Aby wyeliminować out parametr TryParse można abstrakcyjny cały parsowanie w ogólnym delegat jak standardowe 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; 
       }; 

lub w przypadku potrzeby przekazując więcej parametrów użyć Func<string, string, DateTime>, to do ciebie, implementacja (ciąg do logiki parsowania do daty) również zależy od Ciebie.

Następnie użyj w zapytaniu:

converter(rawString) == targetDate 
+1

Co to zrobisz, gdy wpiszesz w nim "8/221/19055" (jako str)? – DOK

+1

To tylko pomysł abstrakcji TryParse przez delegata ogólnego do eliminacji parametru. Możesz rozszerzyć przekazując więcej parametrów za pomocą 'Func <>' i analizując problemy z analizą, biorąc pod uwagę logikę biznesową. – sll

+0

@Wszystko Ładny pomysł, wielkie dzięki. – StatsViaCsh

1

To może być refactored do czegoś takiego bez konieczności funkcji i prostszą zapytania który robi to samo zadanie:

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

Czy masz na myśli to całe mnóstwo, w tym sprawdzanie błędnej wartości daty? – StatsViaCsh

+0

Czy twój plik xml ma schemat, który jest sprawdzany przed stwierdzeniem, że LastTradeDate jest datą, w przypadku której wiesz, że będzie to poprawna data? –

Powiązane problemy