我有一个从数据源填充的gridview,如下所示:
Date Hours
January/2016 26.31
January/2016 25.65
February/2016 12.3
.... ... ....
从该表中我检查每个月的周数并计算它们,所以我可以稍后得到平均值,这是我的代码。
For intMonth = 1 To 12
For X = 0 To GridView.Rows.Count - 1
intDate = Convert.ToDateTime(gvTiempos.Rows(X).Cells(0).Text)
If DatePart("m", intDate) = intMonth Then
Calcular()
End If
Next
Next
这是Calcular()
函数:
Public Function Calcular()
Select Case intMonth
Case 1: JanWeeks+=1
Case 2: FebWeeks+=1
...
Case 12: DecWeeks+=1
我想要做的是避免使用整个Calcular()
函数,并“动态”执行此操作。
换句话说,我想得到这样的东西:
Weeks(intMonth) = "Sum of Weeks for that month"
其中intMonth确定将存储Sum的WeekVariable
我尝试使用List(Of T)
方法失败了,因为根据我的理解,这会创建一个带有静态值的变量列表。
提前致谢
答案 0 :(得分:1)
给定DataTable dt
作为DataSource
且cell / item 1(非0)具有格式化日期,您可以创建Dictionary(of Int32, Int32)
来保存每个月的计数。迭代表应该比围绕控件更快;此外,DataTable
是数据所在的位置。
Dim col As New Dictionary(Of Int32, Int32)
' create 12 keys for 12 months
For n As Int32 = 1 To 12
col.Add(n, 0)
Next
For Each row As DataRow In dt.Rows
col(Convert.ToDateTime(row(1)).Month) += 1
Next
某些广告位将为零,因为代码会提前添加所有广告位。 List(Of Int32)
也可以使用MonthList(n)
来表示N-1个月。您还可以在一行中查询表,组和计数:
Dim monthCount = dt.AsEnumerable.GroupBy(Function(v) v.Field(Of DateTime)(1).Month,
Function(k, v) New With {.Month = k, .Count = v.Count()}).
ToArray()
在这种情况下,结果是一个简洁的列表,其中包含月份和计数(我的日期列表为:{#1/11/2016#, #1/23/2016#, #1/16/2016#, #2/11/2016#, #4/15/2016#}
):
答案 1 :(得分:1)
根据您在评论中的对话,您应该能够简单地执行此操作:
Dim Weeks(12) As Integer
然后将您的Calcular()
来电替换为:
If DatePart("m", intDate) = intMonth Then
Weeks(intMonth) = Weeks(intMonth) + 1
End If
这会创建一个数组来保存一年中每个月(12个月)的总和。