我有一列calendar week
和一列amount
。现在我想总结从4月的第一个日历周开始每4个日历周的金额。例如。如果我在我的初始表中有52个(行)日历周,那么我的最终表中将有13个(行)周(我在这里讨论表格,因为我将尝试将结果绑定到DGV)。
我正在使用Linq-to-dataset并尝试了不同的来源以获取提示如何解决这个问题但是group by,aggregate无法帮助我,但也许有一些我不理解的应用程序,所以我希望你们其中一个Linq - 专家可以帮助我。
通常我发布代码,但我可以给你骨干,因为我没有起点。
_dataset = New Dataset1
_adapter.Fill(_dataset.Table1)
dim query = from dt in _dataset.Table1.AsEnumerable()
答案 0 :(得分:1)
将星期除以4(使用整数除法截断结果)以生成可以分组的值。
答案 1 :(得分:0)
您可以按照自己喜欢的任何方式进行分组。理论上,你可以使用一个简单的递增数字:
var groups = dt
.Select((row, i) => Tuple.Create(row, i / 4))
.GroupBy(t => t.Item2);
(c#表示法)
然后你可以计算每组的总和:
var sums = groups
.Select(g => g.Sum(t => t.Item1.Amount));
你提到你想在某个月开始,例如四月。您可以使用Skip
或Where
dt.Skip(12).Select(...)
i
始终从0开始,确保您的第一组包含4周。但是,要确切知道要跳过多少周或从哪里开始,您需要更多日历信息。我假设你的行中有一些字段提到相应的周的开始日期:
dt.Where(row => row.StartDate >= firstOfApril).Select(...)
答案 2 :(得分:0)
首先将数据转换为月份然后金额的查找。请注意,您的列需要调用CalendarWeek
和Amount
。然后转换为字典并对每个键的值求和:
var grouped = dt.AsEnumerable().ToLookup(o => Math.Ceiling((double) o.Field<int>("CalendarWeek")/4), o => o.Field<double>("Amount"));
var results = grouped.ToDictionary(result => result.Key, result => result.Sum());