LINQ (Language Integrated Query) 是.NET框架中的一组技术,它允许你使用类似SQL的语法来查询各种数据源。Lambda表达式是匿名函数,可以简洁地表示委托或表达式树。
假设你有一组带有日期和数值的数据,想要按每7天为一个周期进行分组并求和,可以使用以下方法:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
// 示例数据:日期和对应的值
var data = new List<DataItem>
{
new DataItem { Date = new DateTime(2023, 1, 1), Value = 10 },
new DataItem { Date = new DateTime(2023, 1, 2), Value = 20 },
new DataItem { Date = new DateTime(2023, 1, 8), Value = 30 },
new DataItem { Date = new DateTime(2023, 1, 9), Value = 40 },
new DataItem { Date = new DateTime(2023, 1, 15), Value = 50 },
new DataItem { Date = new DateTime(2023, 1, 16), Value = 60 },
new DataItem { Date = new DateTime(2023, 1, 22), Value = 70 },
new DataItem { Date = new DateTime(2023, 1, 23), Value = 80 },
};
// 按每7天分组并求和
var result = data.GroupBy(
item => (item.Date - data.Min(d => d.Date)).Days / 7, // 计算周数
(week, items) => new
{
WeekNumber = week,
StartDate = items.Min(i => i.Date),
EndDate = items.Max(i => i.Date),
TotalValue = items.Sum(i => i.Value)
})
.OrderBy(g => g.WeekNumber)
.ToList();
// 输出结果
foreach (var group in result)
{
Console.WriteLine($"Week {group.WeekNumber + 1}: {group.StartDate:yyyy-MM-dd} to {group.EndDate:yyyy-MM-dd}, Total: {group.TotalValue}");
}
}
}
public class DataItem
{
public DateTime Date { get; set; }
public int Value { get; set; }
}
(item.Date - data.Min(d => d.Date)).Days / 7
计算从最早日期开始的周数items.Sum(i => i.Value)
对每个组的值进行求和这种方法适用于:
如果需要从特定日期开始计算7天周期(而不是从数据中的最早日期),可以修改分组键的计算方式:
var referenceDate = new DateTime(2023, 1, 1); // 自定义参考日期
var result = data.GroupBy(
item => (item.Date - referenceDate).Days / 7,
// 其余代码相同
这样分组将从你指定的referenceDate开始计算7天周期。