2

私はこれに非常に困惑しています。.csv ファイルから取得した正と負の整数のみのかなり大きな (~1500 x ~1000) DataTable があります。私のプログラムでは、単一の行または列だけでなく、テーブル全体の最大値を見つける必要があります。最適には、コードは短くて適切ですが、常にそうであるとは限りません ;)。

私のDataTableの名前は、(すでに整数として宣言されている)BeamMapの値を返そうとしています。MaxValueリクエストに応じて、DataTable を作成するためのコードを投稿できます。

追加クレジット: (実際にはそうではありません)

上記の最大値の場所 (つまり、行、列)をすばやく見つける方法はありますか? これまでに見たすべての例では、セルごとに所定の値をチェックしていましたが、これは私が持っているデータ ポイントの数に対してかなり非効率的です。

4

3 に答える 3

10

Compute("MAX(columnName),"") メソッドを使用して、列の最大値を見つけることもできます

Private Function FindMaxDataTableValue(ByRef dt As DataTable) As Integer

    Dim currentValue As Integer, maxValue As Integer
    maxValue = 0

    For c As Integer = 0 To dt.Columns.Count - 1
        currentValue = dt.Compute("MAX(c)", "")
        If currentValue > maxValue Then maxValue = currentValue
    Next
    Return maxValue

End Function
于 2014-06-16T18:19:15.970 に答える
1

このコードはそれを行います。私は巨大なデータテーブルを試していないので、どれくらいの時間がかかるかを確認する必要があります:

Private Function FindMaxDataTableValue(ByRef dt As DataTable) As Integer
    Dim currentValue As Integer, maxValue As Integer
    Dim dv As DataView = dt.DefaultView
    For c As Integer = 0 To dt.Columns.Count - 1
        dv.Sort = dt.Columns(c).ColumnName + " DESC"
        currentValue = CInt(dv(0).Item(c))
        If currentValue > maxValue Then maxValue = currentValue
    Next
    Return maxValue
End Function

各列を順番にソートし、最初の値が現在の最大値よりも大きい場合は更新します。

追加のクレジットとしてこれを行うことができますが、次IndexOfを見つけるために を実行するとパフォーマンスが低下する可能性がありますrowIndex

Private Function FindMaxDataTableValue(ByRef dt As DataTable) As Integer
    Dim currentValue As Integer, maxValue As Integer
    Dim rowIndex As Integer, colIndex As Integer
    Dim dv As DataView = dt.DefaultView
    For c As Integer = 0 To dt.Columns.Count - 1
        dv.Sort = dt.Columns(c).ColumnName + " DESC"
        currentValue = CInt(dv(0).Item(c))
        If currentValue > maxValue Then
            rowIndex = dt.Rows.IndexOf(dv(0).Row)
            colIndex = c
            maxValue = currentValue
        End If
    Next
    Debug.WriteLine("Max value found at Col:" + colIndex.ToString + " Row:" + rowIndex.ToString)
    Return maxValue
End Function
于 2012-06-20T10:22:01.210 に答える