0

さて、私は自分が間違っていることを理解するのに少し苦労しました。基本的に、平均よりも少ないListbox1アイテムを削除する必要がありますが、次のようになります。

System.ArgumentOutOfRangeExceptionが処理されませんでしたMessage=InvalidArgument='9'の値は'index'に対して無効です。パラメータ名:インデックス

Private Sub Label3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label3.Click
    Dim Myrand As New Random
    Dim res As Double
    Dim i As Integer
    Dim n As Integer
    Dim tot As Double
    Dim avarage As Double

    ListBox1.Items.Clear()

    For i = 0 To 14 Step 1
        res = Math.Round(Myrand.NextDouble, 3)
        ListBox1.Items.Add(res)
        tot = tot + res
    Next

    avarage = tot / ListBox1.Items.Count
    MsgBox(avarage)

    For i = 0 To ListBox1.Items.Count - 1 Step 1
        If ListBox1.Items(i) < avarage Then
            ListBox1.Items.RemoveAt(i)
            n = n + 1
        End If
    Next

    MsgBox("Removed " & n & " items!")
End Sub

助言がありますか?

4

2 に答える 2

1

アイテムを削除すると、そのアイテムはリストに含まれなくなるため、リストが短くなり、元のカウントは無効になります。ただデクリメントi

Private Sub Label3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label3.Click
    Dim Myrand As New Random
    Dim res As Double
    Dim i As Integer
    Dim n As Integer
    Dim tot As Double
    Dim avarage As Double

    ListBox1.Items.Clear()

    For i = 0 To 14
        res = Math.Round(Myrand.NextDouble, 3)
        ListBox1.Items.Add(res)
        tot += res
    Next

    avarage = tot / ListBox1.Items.Count
    MsgBox(avarage)

    For i = 0 To ListBox1.Items.Count - 1
        If ListBox1.Items(i) < avarage Then
            ListBox1.Items.RemoveAt(i)
            i -= 1
            n += 1
        End If
    Next

    MsgBox("Removed " & n & " items!")
End Sub
于 2012-04-29T21:52:51.457 に答える
1

For/Next ループの開始時に最大カウントを取得し、再評価しません。行った場所からではなく、行った場所から削除するように、逆方向に反復してみてください。

すなわち

For i = ListBox1.Items.Count - 1 To 0 Step -1
    If ListBox1.Items(i) < avarage Then
        ListBox1.Items.RemoveAt(i)
        n = n + 1
    End If
Next

上記のMSDNリンク強調鉱山から:

For...Next ループが開始されると、Visual Basic は開始、終了、およびステップを評価します。これは、これらの値を評価する唯一の時間です。次に、start を counter に割り当てます。ステートメント ブロックを実行する前に、counter と end を比較します。counter が既に end 値よりも大きい (step が負の場合は小さい) 場合、For ループは終了し、制御は Next ステートメントの次のステートメントに渡されます。それ以外の場合は、ステートメント ブロックが実行されます。

于 2012-04-29T22:03:30.370 に答える