2014-10-30 1 views
-1

가능한 한 최소 레코드 수로 하루 입출력 레코드 목록을 통합하려고 시도합니다.linq 쿼리에서 첫 번째 요소를 제거하는 방법

내가 지금까지 해왔 던 것은 라인을 그룹에 포함시켜 그룹화하고 매일 목록에 넣고 넣는 것입니다.

그런 다음 목록을 처리하고 처음과 끝나는 행 집합을 한 행에 추가 한 후 다음 항목을 처리하고 새 행을 작성하거나 이전 행의 공백을 채우고 싶습니다.

내가 붙잡은 비트는 처리 한 후 첫 번째 항목을 linq 결과에서 제거하는 것입니다.

다른 방식으로 살펴 보는 것을 기쁘게합니다. 여기

내가 무엇을 가지고 :

 List<LoginRecordLine> condensedLoginRecordLines = new List<LoginRecordLine>(); 
     List<LoginRecordLine> currentLoginRecordLines = GetLoginRecordsForLoginRecordReport(lowerDate, upperDate, sageDatabaseID, loggedInUserID); 

     var groupedLines = from LoginRecordLine line in currentLoginRecordLines 
          group line by new { line.TimesheetID, line.WorkPatternPayRateID } into g 
          select new 
          { 
           Lines = g, 
           TimesheetID = g.Key.TimesheetID, 
           PayRateID = g.Key.WorkPatternPayRateID 
          }; 

     foreach (var g in groupedLines) 
     { 
      var monTimes = from line in g.Lines 
          orderby line.MonTimeIn ascending 
          where line.MonTimeSpan != TimeSpan.Zero 
          select new 
          { 
           TimeIn = line.MonTimeIn, 
           TimeOut = line.MonTimeOut, 
           Timesheet = line.Timesheet, 
           PayRate = line.WorkPatternPayRate 
          }; 

      var tueTimes = //Same as monday 

      var wedTimes = //Same as monday 

      var thuTimes = //same as monday 

      var friTimes = //same as monday 

      var satTimes = //same as monday 

      var sunTimes = //same as monday 


      while (monTimes.Count() != 0 || tueTimes.Count() != 0 || wedTimes.Count() != 0 || thuTimes.Count() != 0 || friTimes.Count() != 0 || satTimes.Count() != 0 || sunTimes.Count() != 0) 
      { 
       LoginRecordLine condensedLine = new LoginRecordLine(); 

       if (monTimes.Count() >0) 
       { 
        condensedLine.MonTimeIn = monTimes.First().TimeIn; 
        condensedLine.MonTimeOut = monTimes.First().TimeOut; 
        condensedLine.Timesheet = monTimes.First().Timesheet; 
        condensedLine.WorkPatternPayRate = monTimes.First().PayRate; 

        //*************** REVELANT PART *************/ 
        //remove first item from monday list 
       } 

       // tue 

       // wed 

       // etc 
      } 
     } 

     return condensedLoginRecordLines; 

업데이트 - 작동 코드 - 성능

List<LoginRecordLine> condensedLoginRecordLines = new List<LoginRecordLine>(); 

       List<LoginRecordLine> currentLoginRecordLines = GetLoginRecordsForLoginRecordReport(lowerDate, upperDate, sageDatabaseID, loggedInUserID); 

       var groupedLines = from LoginRecordLine line in currentLoginRecordLines 
            group line by new { line.TimesheetID, line.WorkPatternPayRateID } into g 
            select new 
            { 
             Lines = g, 
             TimesheetID = g.Key.TimesheetID, 
             PayRateID = g.Key.WorkPatternPayRateID 
            }; 

       foreach (var g in groupedLines) 
       { 
        var monTimes = (from line in g.Lines 
            orderby line.MonTimeIn ascending 
            where line.MonTimeSpan != TimeSpan.Zero 
            select new 
            { 
             TimeIn = line.MonTimeIn, 
             TimeOut = line.MonTimeOut, 
             Timesheet = line.Timesheet, 
             PayRate = line.WorkPatternPayRate 
            }).ToList(); 

      var tueTimes = //Same as monday 

      var wedTimes = //Same as monday 

      var thuTimes = //same as monday 

      var friTimes = //same as monday 

      var satTimes = //same as monday 

      var sunTimes = //same as monday 

        while (monTimes.Count != 0 || tueTimes.Count != 0 || wedTimes.Count != 0 || thuTimes.Count != 0 || friTimes.Count != 0 || satTimes.Count != 0 || sunTimes.Count != 0) 
        { 
         LoginRecordLine condensedLine = new LoginRecordLine(); 

         if (monTimes.Count >0) 
         { 
          condensedLine.MonTimeIn = monTimes.First().TimeIn; 
          condensedLine.MonTimeOut = monTimes.First().TimeOut; 
          condensedLine.Timesheet = monTimes.First().Timesheet; 
          condensedLine.WorkPatternPayRate = monTimes.First().PayRate; 

          condensedLoginRecordLines.Add(condensedLine); 

          monTimes.RemoveAt(0); 
         } 

         //etc 
        } 
       } 

       return condensedLoginRecordLines; 
+3

'건너 뛰기'를 보셨습니까? –

+2

첫째, 코드에 심각한 성능 문제가 있습니다. Count()를 잘못 사용하면 오류가 발생합니다. 그것을 Any()로 바꾸십시오. 그렇지 않으면 반복하는 동안 각각에 대해 LINQ 쿼리를 호출합니다. 어쩌면 ToList()를 사용하여 쿼리를 구체화해야 할지도 모릅니다. – galenus

+0

@KirkWoll - 아니요, 건너 뛸 색인에 아무것도없는 경우 어떻게 작동합니까? 예를 들어, 모든 목록은 같은 수의 항목을 갖지 않을 것이고, 월요일에는 2가 될 수 있지만 화요일에는 아무도 또는 아무 것도 없을 수도 있습니다. – WraithNath

답변

2

(0)의 첫 번째 항목을 제거합니다 myList.RemoveAt 같은 List.RemoveAt Method 것을 사용 변경하기 전에 목록

+0

감사합니다. 목록을 작성하는 것이 길일지도 모른다고 생각합니다. 익명 유형을 사용하는 방법을 알지 못합니다. 추신 : 그룹 쿼리 괜찮아, 그게 어디에 내가 건너 뛸 필요가 코드의 하단에 라인을 consensing. – WraithNath

+1

@WraithNath 또한 목록의 모든 항목을 옮길 필요가 없기 때문에 순서를 바꾸고 끝에서 제거하는 것이 좋습니다. – Magnus

+0

@ Magnus - 멋지다. 고맙다. 나는 거의 거기에 있다고 생각한다. 작업 코드를 게시 한 다음 성능을 변경하십시오. – WraithNath

0

알고리즘과 데이터 구조를 수정해야합니다.

var condensedLoginRecordLines = monTimes 
    .Concat(tueTimes) 
    .Concat(wedTimes) 
    ..//etc 
    .Select(data => new CondensedLine { WeekDay = data.WeekDay, /* here all the properties are initialized */ }) 
    .ToList(); 

그리고 :

var monTimes = from line in g.Lines 
         orderby line.MonTimeIn ascending 
         where line.MonTimeSpan != TimeSpan.Zero 
         select new 
         { 
          TimeIn = line.MonTimeIn, 
          TimeOut = line.MonTimeOut, 
          Timesheet = line.Timesheet, 
          PayRate = line.WorkPatternPayRate, 
          WeekDay = DayOfWeek.Monday 
         }; 

그런 다음, 최종 루프가 같은으로 대체 될 것이다 : 나는 된 요일 속성을 추가 할 수 있기 때문에 쿼리가 모양을 쿼리에서 익명 유형의

그게 다야.

MonInTime, TueInTime 등의 속성을 계속 사용하려면 CondensedLine을 별도의 기능으로 이동하여 WeekDay에 스위치를 적용하고 관련 속성 만 초기화하십시오. 이 경우 메서드에서 다른 정보로 정보를 전달하기 위해 현재 사용하는 익명 형식 대신 개인 클래스를 선언해야합니다.

관련 문제