我不知道你是如何计算的,因为我对统计分布的经验有限,而且你没有提到你想要计算它的方式。
但是,这至少可以编译:
Dim stat(2) As Integer
For Each row As DataRow In gridView.Rows
Dim cementDeviation = row.Field(Of Int32)("Cement Deviation")
Select Case cementDeviation
Case 0 To 10
stat(0) += 1
Case 10 To 20
stat(1) += 1
End Select
Next
一般来说,循环DataRows
计算值没有什么不好。但是您应该设置OPTION STRICT
为on
,那么您的代码将无法编译,因为row("Cement Deviation")
它是一个对象而不是整数。好消息是您被迫使用正确的类型,以防止出现令人讨厌的运行时错误。
编辑这是一个示例,您可以如何使用动态范围并使用 LINQ 计算每个类。我已经使用 aDataTable
来存储最小值和最大值,但您也可以使用不同的内存中集合,比如List(Of CustomClass)
甚至更好的 - 数据库。
您也可以简单地循环表格,但您希望看到不同的方法。我喜欢 LINQ,因为它可以降低复杂性并提高可读性:
带有样本数据的范围表:
Dim rangeTable = New DataTable()
rangeTable.Columns.Add("Min", GetType(Int32))
rangeTable.Columns.Add("Max", GetType(Int32))
For i = 0 To 90 Step 10
rangeTable.Rows.Add(i, i + 10)
Next
一个 LINQ 查询来计算每个范围的所有出现,甚至按降序排列:
Dim stats =
From rangeRow In rangeTable
Let min = rangeRow.Field(Of Int32)("Min")
Let max = rangeRow.Field(Of Int32)("Max")
Select StatsInfo = New With {
.Min = min, .Max = max,
.Count = (From devRow In devTable
Let cementDeviation = devRow.Field(Of Int32)("Cement Deviation")
Where cementDeviation >= min AndAlso cementDeviation <= max).Count()
}
Order By StatsInfo.Count Descending
输出结果:
For Each stat In stats
Console.WriteLine("Min: {0} Max: {1} Count: {2}", stat.Min, stat.Max, stat.Count)
Next
请注意,我已将您的名称重命名为DataTable
,devTable
因为gridView
这不是一个好名字。