C# C中按周筛选日期时间的更干净方法#

C# C中按周筛选日期时间的更干净方法#,c#,asp.net,asp.net-mvc,visual-studio,datetime,C#,Asp.net,Asp.net Mvc,Visual Studio,Datetime,我有一个记录日期的大型数据库。当用户选择MTD时,程序从今天开始计算每7天跨度内的记录数(不使用当前月份的周数,因此我不能使用.day或.GetWeekOfMonth)。现在看起来是这样的: if (options.timeRange == "MTD") { if (x.close_dt.Value.Date < DateTime.Today.AddMonths(-1)) { complete = true; } if (DateTi

我有一个记录日期的大型数据库。当用户选择MTD时,程序从今天开始计算每7天跨度内的记录数(不使用当前月份的周数,因此我不能使用.day或.GetWeekOfMonth)。现在看起来是这样的:

    if (options.timeRange == "MTD")
{
    if (x.close_dt.Value.Date < DateTime.Today.AddMonths(-1))
    {
        complete = true;
    }
    if (DateTime.Today.AddMonths(-1).Date <= x.close_dt.Value.Date && x.close_dt.Value.Date <= DateTime.Today)
    {
        if (DateTime.Today.AddDays(-6).Date <= x.close_dt.Value.Date && x.close_dt.Value.Date <= DateTime.Today.Date)
        {
            chartObj.weeks[0]++;
        }
        else if (DateTime.Today.AddDays(-13).Date <= x.close_dt.Value.Date && x.close_dt.Value.Date <= DateTime.Today.AddDays(-7).Date)
        {
            chartObj.weeks[1]++;
        }
        else if (DateTime.Today.AddDays(-20).Date <= x.close_dt.Value.Date && x.close_dt.Value.Date <= DateTime.Today.AddDays(-14).Date)
        {
            chartObj.weeks[2]++;
        }
        else if (DateTime.Today.AddDays(-27).Date <= x.close_dt.Value.Date && x.close_dt.Value.Date <= DateTime.Today.AddDays(-21).Date)
        {
            chartObj.weeks[3]++;
        }
    }
}
if(options.timeRange==“MTD”)
{
如果(x.close_dt.Value.Dateif(DateTime.Today.AddMonths(-1).Date我仍然不确定我是否正确地理解了您,但是如果您只想检查前4周的todays日期并增加每个“周”的计数,您可以大大简化代码

首先,不要重复常见代码,保持代码干燥:

private static bool DateInRange(DateTime date, DateTime minDate, DateTime maxDate)
{
    return date.Date > minDate.Date && date.Date <= maxDate.Date;
}

Fiddle

您可以通过
可枚举的.Range
ToDictionary
轻松做到这一点:

var recordsByWeek = Enumerable.Range(0, 4).ToDictionary(i => i + 1, i =>
{
    var start = DateTime.Today.AddDays(7 * i);
    var end = start.AddDays(7);
    return records.Where(r => start <= r.Date && r.Date < end).ToList();
});
更新

我最初错过了前几周的部分。代码基本上是一样的,但有一些细微的修改。我将把原始代码留作比较,以防互联网上的人偶然发现这一点,而实际上需要它

var recordsByWeek = Enumerable.Range(0, 4).Reverse().ToDictionary(i => 4 - i, i =>
{
    var end = DateTime.Today.AddDays(-7 * i);
    var start = end.AddDays(-7);
    return records.Where(r => start <= r.Date && r.Date < end).ToList();
});

这个函数到底应该做什么?如果是MTD,为什么要减去一个月?@maccettura这是在foreach循环中。x是当前记录,记录按日期降序排序。该函数计算每个“周”中的记录数。周是前7天的跨度。x.close_dt.Value.dateWeek 1 Record Count: @recordsByWeek[1].Count;
var recordsByWeek = Enumerable.Range(0, 4).Reverse().ToDictionary(i => 4 - i, i =>
{
    var end = DateTime.Today.AddDays(-7 * i);
    var start = end.AddDays(-7);
    return records.Where(r => start <= r.Date && r.Date < end).ToList();
});
var end = DateTime.Today.AddDays(-7 * i + 1);