我想按月计算一整年的总时数。 然而,我已经在一个问题上遇到了几个月的问题,并在本周中开始。 这是我的解决方案,但我必须硬编码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;
答案 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);