2014-10-30 103 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

您曾看过'Skip'? – 2014-10-30 08:31:57

+2

首先,您的代码中存在严重的性能问题:使用Count()时您使用它是错误的。用Any()替换它,否则你在每次迭代时调用你的LINQ查询。也许你应该考虑使用ToList()来实现查询。 – galenus 2014-10-30 08:32:39

+0

@KirkWoll - 暂时还没有,如果索引中没有内容可以跳过,它将如何工作?例如,所有列表不会有相同数量的条目,星期一可能有2个,但在星期二没有或一个 – WraithNath 2014-10-30 08:33:23

回答

2

使用List.RemoveAt Method像myList.RemoveAt(0)将删除的第一个项目你列表

+0

谢谢,我想列表可能是要走的路,只是不知道他们如何使用匿名类型。 PS,组查询是好的,它在哪里我认同代码底部的行,我需要跳过。 – WraithNath 2014-10-30 08:39:42

+1

@WraithNath另外一个好主意是反转订单并从最后移除,而不需要移动列表中的所有项目。 – Magnus 2014-10-30 08:43:07

+0

@Magnus - 很酷,谢谢,我想它几乎就在那里。我发布工作代码,然后改变性能 – WraithNath 2014-10-30 08:44:28

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上应用切换并仅初始化相关属性。在这种情况下,您应该声明一个私有类,而不是您当前使用的匿名类型,以便将方法中的信息传递给另一个类。