2012-01-25 5 views
10

私は毎日の株式市場データのメモリxmlで作業していますが、そのうちの1つの日付については "8/221/19055"という値が得られます。私はTryParseが有効な日付をチェックする可能性が最も高いと思うが、MSDNのドキュメントは2番目のパラメータ "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

where s.Element( "LastTradeDate")。HasValue && where.Element( "LastTradeDate")== targetDateクエリでletの値が失われるようにします。 –

1
Datetime somedate; 

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

    code for using date goes here 

} 
+0

ありがとう...私はlinqに新しいので、私はどのように私のvar =ステートメントにそれを組み込むか分からない。 – StatsViaCsh

3

あなたが標準Converter<TInput, TOutput>ような一般的なデリゲートで抽象全体解析することができますTryParseoutパラメータ解消するには、次の

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 
+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が有効な日付であることがわかっている日付であることを証明するスキーマがありますか? –

関連する問題