統計分布に関する私の経験は限られており、計算方法について言及していないため、どのように計算するのかわかりません。
ただし、これは少なくともコンパイルされます。
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で各クラスをカウントする方法の例です。最小値と最大値を格納するためにa を使用しDataTable
ましたが、別のインメモリ コレクション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