2014-10-30 2 views
-1

Im пытается консолидировать список записей входов и выходов в день до минимального количества записей.Как удалить первый элемент из запроса 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; 

Update - Рабочий код - перед выполнением изменений

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

Вы посмотрели 'Skip'? –

+2

Во-первых, у вас есть серьезная проблема с производительностью в вашем коде: использование Count(), поскольку вы используете это неправильно. Замените его на Any(), иначе вы будете ссылаться на ваши запросы LINQ на каждом этапе при итерации. Возможно, вам стоит даже рассмотреть вопрос о материализации запросов с помощью ToList(). – galenus

+0

@KirkWoll - еще нет, как это будет работать, если в индексе нет ничего пропустить? например, у всех списков не будет одинакового количества записей, может быть 2 по понедельникам, но ни один, ни один во вторник – WraithNath

ответ

2

использовать List.RemoveAt Method что-то вроде myList.RemoveAt (0) удалит первый элемент вашего список

+0

Спасибо, я думаю, что список может быть путем, просто не уверен, как они работают с анонимными типами. ps, групповой запрос в порядке, его где im заказывает строки в нижней части кода, которые мне нужно пропустить. – WraithNath

+1

@WraithNath Также неплохо было бы отменить порядок и удалить из конца, так как все элементы в списке не нужно перемещать. – Magnus

+0

@ Magnus - круто, спасибо, я думаю, его почти там. Ill опубликуйте рабочий код, затем измените его на производительность. – WraithNath

0

Вы должны пересмотреть свой алгоритм и, возможно, структуры данных.

Для анонимных типов в запросах Я хотел бы добавить свойство DAYOFWEEK, поэтому запросы будут выглядеть так:

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 
         }; 

Затем окончательный контур будет заменен на что-то вроде:

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

И это все.

Если вы все еще предпочитаете использовать свойства MonInTime, TueInTime и т. Д., Переместите создание CondensedLine в отдельную функцию, которая применяет переключатель в WeekDay и инициализирует только соответствующие свойства. В этом случае вы должны объявить частный класс вместо анонимных типов, которые вы используете в настоящее время, чтобы передавать информацию из метода в другой.

Смежные вопросы