1

我正在尝试逐月计算一整年的总小时数。但是,我已经遇到了几个月的问题,该问题在一周中结束并开始。这是我的解决方案,但是,我必须对 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;
4

1 回答 1

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);
于 2012-04-06T00:07:16.303 回答