2016-07-13 20 views
1

私は1000データポイントを含むDataGridViewを持っています。私は正常に私のDataGridViewの値の最小、最大、および平均を計算しましたが、今、私は、特定の範囲からの最小値、最大値、平均値を取得したい。たとえば、101〜200または201〜300のデータ。Datagridview、特定の範囲で最小、最大、平均を取得する方法

For i As Integer = 0 To dataGridView1.Rows.Count() - 1 Step +1 

    sum_tmp = sum_tmp + dataGridView1.Rows(i).Cells(2).Value 

    If i = 0 Then 
     max_tmp = dataGridView1.Rows(i).Cells(2).Value 
     min_tmp = dataGridView1.Rows(i).Cells(2).Value 
    End If 

    If max_tmp < dataGridView1.Rows(i).Cells(2).Value Then 
     max_tmp = dataGridView1.Rows(i).Cells(2).Value 
    End If 

    If min_tmp > dataGridView1.Rows(i).Cells(2).Value Then 
     min_tmp = dataGridView1.Rows(i).Cells(2).Value 
    End If 

Next 

avg_tmp = sum_tmp/dataGridView1.Rows.Count() 

上記の値を取得するコードです。私は、コンボボックスを選択することによって変更された整数変数を使用しようとしましたが、常にminに0の値を取得します。悲しいことに、それは平均で正しい値を示しています。どのように間違っているのでしょうか?

+0

'Filter関数 'を使用し、' Betweenメソッド'を使用して 'DataView'を使用して値を取得できますか? DataTable.FIlter()メソッドでGoogle検索を実行する – MethodMan

+0

合計または平均を計算するときはいつですか?コンテキストメニュー項目の行とクリックをユーザーが選択していますか? –

+0

@AlexB。あなたは良い質問をする。私は2つの単一の値(最初の行、最後の行) – djv

答えて

0

あなたが処理したい値の列挙コレクションを取得するためにLINQ式を使用することができ、その後、MAX、MINを取得するには、組み込み関数を使用し、平均

は、結果を保持する構造体を定義します。計算

Private Structure ResultsStruct 
    Public Min As Single 
    Public Max As Single 
    Public Average As Single 
    Public Sum As Single 
End Structure 

この関数は、呼び出されたときに構造体を返します。最初の行のインデックスと最後の行のインデックスを渡します。それはそれは、グリッドや入力の他の手段を選択するユーザからのものであるかどうか、興味のある範囲での例では201300を交換し

Dim result = getResults(firstRow:=201, lastRow:=300) 
MessageBox.Show(String.Format("Max: {0}, Min: {1}, Avg: {2}, Sum: {3}", 
           result.Max, result.Min, result.Average, result.Sum)) 

と呼ばれていますどのように

Private Function getResults(firstRow As Integer, lastRow As Integer) As ResultsStruct 
    Dim skipRows = firstRow - 1 
    Dim takeRows = lastRow - skipRows 
    Dim values = DataGridView1.Rows. 
     OfType(Of DataGridViewRow)(). 
     Select(Of Single)(Function(r) Single.Parse(r.Cells(0).Value.ToString())). 
     Skip(skipRows). 
     Take(takeRows) 
    Dim max = values.Max() 
    Dim min = values.Min() 
    Dim avg = values.Average() 
    Dim result As New ResultsStruct() With {.Max = values.Max(), 
              .Min = values.Min(), 
              .Average = values.Average(), 
              .Sum = values.Sum()} 
    Return result 
End Function 

+0

答えていただきありがとうございます、今私の "基礎知識の低さ"を解決するために、関数が呼び出される方法を簡素化するために私の答えを編集:D – Yon

関連する問題