2016-10-31 6 views
0

私はこのエラーが発生しています:LINQ - "インデックスが配列の範囲外です。"

"インデックスが配列の境界外にありました。" A.LogOutTimeはその後、 "不明" を表示nullを返している場合は、このLINQクエリ

私が欲しいを使用することにより

var listItems = (from A in data orderby A.FirstName 
    select new { 
     Action = "Logout", 
     UserName = A.FirstName + " " + A.SurName, 
     ID = A.Id, 
       AccessDate = (A.LogOutTime ?? "Unknown") 
         .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[0], 
       AccessTimeFrame = (A.LogOutTime ?? "Unknown") 
          .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[1] 
         + " " + (A.LogOutTime ?? "Unknown") 
          .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[2], 
       Comment = "Never delete this Archive" 
 }).Distinct(); 

どうすればこの問題を解決できますか?

+3

これはLINQとは関係ありません。あなたの配列をチェックし、あなたは間違ったインデックスを使っています。おそらく、空の配列の項目にアクセスしようとしていますか? –

+4

もう少し扱いやすいものに分割しますか?一見すると、多くの項目を持つことが保証されていない配列には多くのインデックスがあります(たとえばヌルの場合は、「Unknown」に設定します。分割すると、単一の項目しか持たない) 1または2はこの例外で失敗します)。 –

+5

スペース上で「Unkown」を分割すると、値が1つしかない配列が得られます。 – juharr

答えて

1

問題はA.LogOutTimeがあるときnullあなたが後で返さIEnumerableのいくつかの指標に行くに" "によって分割文字列"Unknown"を配置することです。これらのインデックスは存在しないため、そのエラーが発生します。

私はあなたが以下のような何かをすることを示唆している:

  1. 使用letので、あなたがスプリットを毎回繰り返さないでください。回避するために分割するときにC#6.0 ?.を使用NullReferenceExceptionLogOutTimenullある場合性チェックに割り当て、そう"Unknown"を割り当てると場合
  2. LogOutTimeがヌルである場合にsectionsも依然としてNULLであろう) 。 LogOutTimeがあることを確認することでも

    var listItems = (from A in data 
           orderby A.FirstName 
           let sections = A.LogOutTime?.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)    
           select new { 
            Action = "Logout", 
            UserName = A.FirstName + " " + A.SurName, 
            ID = A.Id, 
            AccessDate = A.LogOutTime == null ? "Unknown" : sections.ElementAtOrDefault(0), 
            AccessTimeFrame = A.LogOutTime == null ? "Unknown" : (sections.ElementAtOrDefault(1) + " " + 
                 sections.ElementAtOrDefault(2)), 
            Comment = "Never delete this Archive" } 
           ).Distinct(); 
    

    :必要に応じて、それが使用ElementAtOrDefault(n)

  3. 分割の結果を使用していない場合ので、あなたはとても

存在しないインデックスにアクセスしていませんいいえnull私はそれがstringと仮定します。代わりにDateTimeとして保存してください。存在しないインデックスを分割してアクセスするという問題はありません。目的の形式を指定する場合は、DateTimeまたはToString()オーバーロードのさまざまなプロパティを使用します。この問題の詳細については、Custom Date and Time Format Strings

1

「let」キーワードを使用して、ログアウト時間の部分を1回だけ分割します。次に、AccessTimeFrameの計算中に部品の長さを確認します。

関連する問題