2016-10-31 4 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

좀 더 관리하기 쉬운 것으로 나눠 봤어? 한 눈에 많은 항목을 가질 수있는 배열에 대한 많은 인덱스가 있습니다 (예 : null 인 경우 "Unknown"으로 설정하면 분할 할 때 하나의 항목 만 포함됨 - 항목을 가져 오려고 시도 함). 1 또는 2는이 예외와 함께 실패합니다. –

+5

공간에 "Unkown"을 분할하면 하나의 값만있는 배열이 생성됩니다. – juharr

답변

1

문제는 A.LogOutTime 인 경우 null 당신은 당신이 나중에 반환 IEnumerable의 일부 인덱스로 이동에 " "에 의해 분할 문자열 "Unknown"를 배치한다는 것입니다. 그 색인은 존재하지 않으므로 오류가 발생합니다.

  1. 사용 let 그래서 당신은 분할 매번 반복하지 않습니다

    난 당신이 다음과 같은 일을하는 것이 좋습니다. 방지하기 위해 분할 할 때 C# 6.0 ?.를 사용하십시오 NullReferenceExceptionLogOutTimenull 경우 속성 검사에 할당하고 그래서 "Unknown"를 할당하는 경우 때

  2. 합니다 (LogOutTime가 null의 경우에 sections은 여전히 ​​null가됩니다) . 또한

    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(); 
    

    LogOutTime임을 확인하여 : 그것은 필요

  3. 사용 ElementAtOrDefault(n)로 분할의 결과를 사용하지 않은 경우 그래서 당신은

그래서 존재하지 않는 인덱스에 액세스하지 않습니다 아니 null 나는 그것이 string이라고 가정합니다. 대신 DateTime으로 저장 한 다음 존재하지 않는 색인을 분리하고 액세스하는 데 문제가 없습니다. 원하는 형식을 지정하는 DateTime 또는 ToString() 오버로드의 다른 속성을 사용하십시오. 문제에 대한 자세한 내용은 : Custom Date and Time Format Strings

1

"let"키워드를 사용하여 로그 아웃 시간 부분을 한 번만 분할 할 수 있습니다. 그런 다음 AccessTimeFrame을 계산하는 동안 파트의 길이를 확인하십시오.

관련 문제