2012-01-25 3 views
10

나는 매일 주식 시장 데이터의 메모리 xml을 가지고 일하고 있는데, 날짜 중 하나에 대해 "8/221/19055"값을 얻고 있습니다. TryParse가 유효한 날짜를 확인하는 최선의 방법 일 가능성이 높지만 MSDN 문서는 두 번째 매개 변수 인 "out DateTime result"에 대한 설명에 비추어 보입니다. 어떻게 내 linq 쿼리에서 사용할 수 있습니까?XML 데이터의 linq 쿼리에서 TryParse를 사용하는 방법은 무엇입니까?

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

는이를 그 변수를 먼저 변수에 저장하려고 시도한 다음 ur linq의 2 개 날짜를 xml과 비교합니다. – Boomer

+0

@Boomer 감사합니다.이 점을 고려하면 솔루션이 될 것입니다. – StatsViaCsh

답변

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

고맙습니다 .. 제가 구조화 된 방식을 구현하는 가장 직접적인 방법이 될 것 같습니다. – StatsViaCsh

+0

한 번 더 보니 한 번 시도해 볼 필요가 없다는 것입니다. 그냥 HasValue를 사용하십시오 : –

+1

여기서 s.Element ("LastTradeDate"). HasValue && where s.Element ("LastTradeDate") == targetDate 쿼리에서 let 값을 풀 수 있도록 생각합니다. –

1
Datetime somedate; 

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

    code for using date goes here 

} 
+0

고마워 ... 나는 linq에 익숙하다. 그래서 나는 그것을 var = statement에 통합하는 방법을 모르겠다. – StatsViaCsh

3

TryParseout 매개 변수는 표준 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> 사용, 그것이 당신에게 구현 (string to date 파싱 로직)은 당신에게 달렸습니다.

그런 다음 쿼리에서 사용

converter(rawString) == targetDate 
+1

"8/221/19055"를 str으로 전달하면 어떻게됩니까? – DOK

+1

이것은 매개 변수를 제거하기 위해 일반 대리인에 의해 TryParse를 추상화하는 아이디어 일뿐입니다. 'Func <>'을 사용하여 더 많은 매개 변수를 전달하고 비즈니스 로직을 고려한 구문 분석 문제를 분석 할 수 있습니다. – sll

+0

@sll 좋은 생각, 많은 감사. – StatsViaCsh

1
이 기능에 대한 필요성과 같은 작업을 수행하는 간단한 쿼리를 이런 식으로 뭔가를 리팩토링 할 수

:

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

잘못된 날짜 값을 확인하는 것을 포함하여 그게 전부라는 것을 의미합니까? – StatsViaCsh

+0

XML에 유효 기간이 있음을 알리는 날짜 인 LastTradeDate가 있음을 증명하는 스키마가 있습니까? –

관련 문제