c# - 将最近 2 周的数据拆分为当前周和前一周

标签 c# linq highcharts

trendData 是一个事件日志列表,使用当前 UTC 日期作为结束日期,开始日期为当前 UTC 日期 -13(数据库将日期存储为 UTC)

DateTime dUtcEnd = DateTime.UtcNow.Date;
DateTime dUtcStart = dUtcEnd.AddDays(-13);

var trendData = (from e in db.EventLogs
                where e.EventDateTime >= dUtcStart && e.EventDateTime <= dUtcEnd
                      && e.EventType == 'some event'
                select e).ToList();

有没有办法以周为增量TakeSkip 来填充当前和前几周的数组值?

类似的东西?我以某种方式想象 TakeSkip 需要将其基于 EventDateTime 以确定考虑当前和前几周。

var currentTrend = trendData.Take(7).Reverse();
var previousTrend = trendData.Skip(7).Take(7).Reverse();

为了进一步说明要完成的工作,下面是如何填充 Highcharts 数组的想法。

返回的结果将包含 3 个数组。

WeeklyTrend results = new WeeklyTrend();
results.Categories = new string[7];
results.ThisWeek = new int[7];
results.LastWeek = new int[7];

用今天的值填充类别,对于当前一周,每次减少一天。

int dayCounter = 6;
for (int i = 0; i < 7; i++)
{
    results.Categories[i] = dUtcEnd.AddDays(-dayCounter).ToShortDateString();
    dayCounter--;
}

查看 Categories 数组以找到 EventDateTime 与数组中的日期匹配的数组值。

foreach (var cTrend in currentTrend)
{
    var dayOfWeek = Array.FindIndex(results.Categories, c => c.Contains(cTrend.EventDateTime.ToShortDateString()));

    results.ThisWeek[dayOfWeek]++;
}

在 Categories 数组中查找数组值,其中 EventDateTime 与数组中的日期相匹配,并添加天数以匹配当前周。

foreach (var pTrend in previousTrend)
{
    var dayOfWeek = Array.FindIndex(results.Categories, c => c.Contains(pTrend.EventDateTime.AddDays(6).ToShortDateString()));

    results.LastWeek[dayOfWeek]++;
}

最终目标是填充 Highcharts 趋势图,显示本周与前一周相比的数据。

enter image description here

最佳答案

我倾向于在您的 linq 中使用 GroupBy。考虑到这一点,我快速谷歌了一下,并在 SO 上找到了一些。引起我注意的是这个:

C# Linq or Lambda expression Group by Week IEnumerable list with date field

基本上,解释一下:

DateTime dUtcEnd = DateTime.UtcNow.Date;
DateTime dUtcStart = dUtcEnd.AddDays(-13);

var eventLogs = new List<EventLogs>();

var weekTrendGroups = eventLogs
    .Where(x => x.EventDateTime >= dUtcStart 
                && x.EventDateTime <= dUtcEnd
                && x.EventType == "some event")
    .Select(p => new
    {
        Event = p,
        Year = p.EventDateTime.Year,
        Week = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear
                (p.EventDateTime, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
    })
    .GroupBy(x => new { x.Year, x.Week })
    .Select((g, i) => new
    {
        WeekGroup = g,
        WeekNum = i + 1,
        Year = g.Key.Year,
        CalendarWeek = g.Key.Week
    });

foreach (var eventLogGroup in weekTrendGroups)
{
    Console.WriteLine("Week " + eventLogGroup.WeekNum);
    foreach (var proj in eventLogGroup.WeekGroup)
        Console.WriteLine("{0} {1} {2}",
            proj.Event.EventType,
            proj.Event.EventDateTime.ToString("d"),
            proj.Event.Id);
}

[edit] - 固定函数以匹配您的数据属性。

因此,在本例中,数据在 DayOfWeek.Monday 的边界上按周整齐地切分。你当然可以改变以适应。然后您就可以参加 WeekNum 并参加其中的小组聚会。

这看起来是一个巧妙的解决方案,因为您当然可以将自己的谓词应用于它以按照您认为合适的方式对其进行切片。

关于c# - 将最近 2 周的数据拆分为当前周和前一周,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20689149/

相关文章:

javascript - 在 highchart 中应用股票图表样式

c# - 创建线程前台 VS Thread.Join()

c# - 从sql数据库检索图像(字节数组)并显示图像

sql - LINQ 到 SQL : table insert on multiple tables

javascript - 如何访问 highcharts 的plotOptions中的 'this'字段

javascript - 较高值的条形图未显示在 Highcharts 中

c# - 任务错误处理-Visual Studio停止

c# - 单击按钮时运行代码隐藏代码的 Javascript

c# - Linq 查询来填充复杂模型?

asp.net-mvc - ASP.NET MVC 应用程序用户 linq 加入其他表