2011-07-05 5 views
1

繰り返しのいずれかが失敗を無視して成功を維持できない場合に、linqを使用するときにどのように(もし可能であれば)知っていれば誰でも知ることができます。例:私はCSVインポートしています:キャスト時のLinqエラー。成功したコンバージョンを維持できますか?

string[] csvRows = File.ReadAllLines(fiList[fileCount].FullName);  

var Rows = from row in csvRows.Skip(1) 
      let data = row.Split(',') 
      select new 
      { 
       Reference = data[0], 
       RequestDate = Convert.ToDateTime(data[1]), 
      }; 

をしてCSVファイルを次のようになります。

リファレンス、RequestDate ref1,20/6月10日午後12時00分00秒 ref2,55/06/10 00:00:00

明らかに、それはdatetimeに変換できないため(「文字列は有効なDateTimeとして認識されませんでした」)、失敗します。 .netがこれを無視して最初の行を返すように強制する方法はありますか?事前に

乾杯

ステュー

答えて

1

あなたはテストし、無効な行をフィルタリングできます。

var rows = csvRows.Skip(1).Select(r => 
    { 
     var data = r.Split(','); 
     DateTime result; 

     if(DateTime.TryParse(data[1], out result)) 
      return new { Reference = data[0], RequestDate = result}; 
     else return null; 
    }).Where(x=> x!=null); 

は個人的に私は、コードをより読みやすくなり、この場合のforeachループのために行くと思います。

public static bool IsValidColumnSet(string[] data) 
{ 
    DateTime result; 

    if(DateTime.TryParse(data[1], out result)) 
     return true; 
    else return false; 
} 

var Rows = from row in csvRows.Skip(1) 
      let data = row.Split(',') 
      where IsValidColumnSet(data) 
      select new 
      { 
       Reference = data[0], 
       RequestDate = Convert.ToDateTime(data[1]), 
      }; 
+0

グレート答え:

読みやすさをサポートするための代替は、妥当性検査(単なる例)を考慮することです。上記のコードは少し剥ぎ取られていますが、いくつかの日付をチェックする必要がありますが、(DateTime.TryParse(data [1]、out result)&& DateTime.TryParse(data [5]、out結果))など。 – stuartw87

+0

@ stuartw87:ラムダ式の中に "normal"コードを書くことができます。これは、さらに処理したいタイプのインスタンスを返す限りです。そうすることができます。 – BrokenGlass

+0

もう一度BrokenGlassに感謝します。私はこれが今働いていると私の他の要件をストリップし、それらの不良行を格納するのに役立ちます。 – stuartw87

1

あなたのLINQの句にwhere DateTime.TryParse(data[1], out yourvar);を追加することができます。それをテストしなかったが、それは動作するはずです。

関連する問題