使用linq,每个月共计一个小时

时间:2012-04-05 22:52:44

标签: c# linq sum

我想按月计算一整年的总时数。 然而,我已经在一个问题上遇到了几个月的问题,并在本周中开始。 这是我的解决方案,但我必须硬编码linq才能在这个特定的工作日期工作。 在这个例子中

 WeekStart is Febuary 26 2012 - SUNDAY
    WeekEnd is March 1 2012 - THURSDAY

现在在我的硬编码示例中 当它是正常的一周使用时(参考sumval)

.ToUpper()).Sum(y => y.TOTALHOURS).Value;

当它是下个月的拆分周时,它将使用(参考sumval1)

.ToUpper()).Sum(y => y.THURSDAY + y.FRIDAY + y.SATURDAY).Value;

当它是前一个月的拆分周时(参考sumval2)

.ToUpper()).Sum(y => y.SUNDAY + y.MONDAY + y.TUESDAY + y.WEDNESDAY).Value;

根据这些时间,将在两个月之间分配的适当月份收费。

问题是我不想在本周的这几天硬编码,我如何动态填充应该为sumval1和sumval2添加的日子

  double sumval =    data.Where(x => 
    //ExportHelper.isSplitWeek(x.WKENDDATE, x.WKENDDATE.AddDays(6)) != true &&
    x.PORTFOLIO.ToUpper() == item.portfolio.ToUpper() &&
    x.PHASE.ToUpper() == portitem.phase.ToUpper() && 
    x.PHASEDESCRIPTION.ToUpper() == portitem.phasedesc.ToUpper() && 
    x.WKENDDATE.ToString("MMM yyyy").ToUpper() == monitem.monthname.ToString() 
   .ToUpper()).Sum(y => y.TOTALHOURS).Value;


  double sumval1 =
       data.Where(x =>
       ExportHelper.isSplitWeek(x.WKENDDATE, x.WKENDDATE.AddDays(6)) == true &&
       x.PORTFOLIO.ToUpper() == item.portfolio.ToUpper() &&
       x.PHASE.ToUpper() == portitem.phase.ToUpper() &&
       x.PHASEDESCRIPTION.ToUpper() == portitem.phasedesc.ToUpper() &&
       ExportHelper.getSplitEndDate(x.WKENDDATE).AddDays(1).ToString("MMM yyyy").ToUpper() == monitem.monthname.ToString()
      .ToUpper()).Sum(y => y.THURSDAY + y.FRIDAY + y.SATURDAY).Value;



  double sumval2 =
      data.Where(x =>
      ExportHelper.isSplitWeek(x.WKENDDATE, x.WKENDDATE.AddDays(6)) == true &&
      x.PORTFOLIO.ToUpper() == item.portfolio.ToUpper() &&
      x.PHASE.ToUpper() == portitem.phase.ToUpper() &&
      x.PHASEDESCRIPTION.ToUpper() == portitem.phasedesc.ToUpper() &&
      x.WKENDDATE.ToString("MMM yyyy").ToUpper() == monitem.monthname.ToString()
     .ToUpper()).Sum(y => y.SUNDAY + y.MONDAY + y.TUESDAY + y.WEDNESDAY).Value;

1 个答案:

答案 0 :(得分:1)

我认为您最好将数据放入一个更能代表您想要查看数据的自定义类。假设您在周末日期进行比较并访问一周中每一天的属性,我假设数据是每周一次。

鉴于此,我建议将data类型的任何类型转换为每日级别的内容,每天使用实际的datetime表示形式。假设你创建了一个这样的类:

public class MyClass
{
    DateTime Date {get;set;}
    int Val {get;set;}
    ... //other properties
}

你可以将data中的一条记录转换成一堆MyClass这样的实例(假设WKENDDATE表示星期六):

List<MyClass> transformed = new List<MyClass>
foreach(var item in data)
{
    var sunday = new MyClass{Date = item.WKENDDATE.AddDays(-6), Val = item.SUNDAY};
    var monday = new MyClass{Date = item.WKENDDATE.AddDays(-5), Val = item.MONDAY};
    ...
    transformed.Add(sunday);
    transformed.Add(monday);
    ...
}

以这种形式获得数据后,按月汇总是微不足道的:

int month = 1; 
int year = 2012; 
var jan2012 = transformed.Where(x => x.Date.Month == month && x.Date.Year == year).Sum(x=>x.Val);