如何在.NET Framework 4中计算List(Of ZZZ)里Top N周的Cost总和并统计实际选中的周数
我来帮你搞定这个需求!咱们一步步来修改代码,既实现Top N周的Cost求和,又能统计实际选中的周数,完全兼容.NET Framework 4环境。
核心思路
要实现你的需求,关键是先锁定最大的N个不同周数,再筛选对应项求和:
- 先提取集合里所有不重复的Week值,按降序排序(这样最大的周数排在最前面)
- 取排序后的前
NumOfWeeksToSelect个周数,得到目标周列表 - 筛选原集合中属于这些目标周的项,计算它们的Cost总和
- 实际选中的周数就是目标周列表的元素个数(自动处理N远超实际不同周数的情况)
修改后的完整代码
把你原来的Total = ...那部分替换成下面的代码,同时添加统计实际周数的逻辑:
Imports System Imports System.Linq Imports System.Collections.Generic Public Module Module1 Public Sub Main() Dim MyZZZ As New List(Of ZZZ) Dim Total As Single Dim NumOfWeeksToSelect As Integer = 2 MyZZZ.Add(New ZZZ With {.Cost = 1.1, .Week = 100}) MyZZZ.Add(New ZZZ With {.Cost = 2.2, .Week = 100}) MyZZZ.Add(New ZZZ With {.Cost = 3.3, .Week = 99}) MyZZZ.Add(New ZZZ With {.Cost = 4.4, .Week = 99}) MyZZZ.Add(New ZZZ With {.Cost = 5.5, .Week = 95}) MyZZZ.Add(New ZZZ With {.Cost = 6.6, .Week = 95}) MyZZZ.Add(New ZZZ With {.Cost = 7.7, .Week = 95}) MyZZZ.Add(New ZZZ With {.Cost = 8.8, .Week = 90}) MyZZZ.Add(New ZZZ With {.Cost = 9.9, .Week = 80}) MyZZZ.Add(New ZZZ With {.Cost = 10.10, .Week = 70}) ' 获取Top N的周数列表 Dim topWeeks = MyZZZ.Select(Function(t) t.Week).Distinct().OrderByDescending(Function(w) w).Take(NumOfWeeksToSelect).ToList() ' 计算这些周的Cost总和 Total = MyZZZ.Where(Function(t) topWeeks.Contains(t.Week)).Sum(Function(t) t.Cost) ' 统计实际选中的周数 Dim selectedWeekCount = topWeeks.Count Console.WriteLine($"实际选中的周数:{selectedWeekCount}") Console.WriteLine($"Top {NumOfWeeksToSelect}周的Cost总和:{Total}") End Sub Private Class ZZZ Public Cost As Single Public Week As Integer End Class End Module
代码说明
Distinct():确保我们只处理不同的周数,避免重复计算同一个周OrderByDescending(Function(w) w):将周数从大到小排序,保证最大的周数优先被选中Take(NumOfWeeksToSelect):提取前N个最大的周数Where(Function(t) topWeeks.Contains(t.Week)):筛选出原集合中属于目标周的所有项selectedWeekCount = topWeeks.Count:自动处理N超过实际不同周数的情况(比如N=100时,会返回所有6个不同的周数)
测试结果
- 当
NumOfWeeksToSelect = 2时,实际选中周数是2,总和为1.1+2.2+3.3+4.4=11.0 - 当
NumOfWeeksToSelect = 3时,实际选中周数是3,总和为1.1+2.2+3.3+4.4+5.5+6.6+7.7=30.8 - 当
NumOfWeeksToSelect = 100时,实际选中周数是6,总和为所有项的Cost之和
内容的提问来源于stack exchange,提问作者Slugsie
相关产品推荐
相关产品推荐

