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();
有没有办法以周为增量Take
和Skip
来填充当前和前几周的数组值?
类似的东西?我以某种方式想象 Take
和 Skip
需要将其基于 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 趋势图,显示本周与前一周相比的数据。
最佳答案
我倾向于在您的 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/