从VB中的List中删除值

时间:2014-09-25 13:59:16

标签: vb.net

我正在做一笔交易或者不做交易'在Visual Basic 2008中为项目键入游戏。

我在将5个值随机分配到5个框时遇到问题。

例如,在一个游戏中,框可以包含以下值:

Box 1 = 1000 
Box 2 = 35000
Box 3 = 25000
Box 4 = 75000
Box 5 = 5000

在另一个游戏中,他们可以保留这些值

Box 1 = 75000 
Box 2 = 25000
Box 3 = 1000
Box 4 = 5000
Box 5 = 35000

主要目的是将这些值随机分配到每个框中,一旦分配了值,就不能同时将其分配给另一个框。

以下是我目前的代码:

        Dim values As New List(Of Integer)
        Dim box(4) As Integer
        Dim randNum(4) As Integer

        'adding values to the Value list
        values.Add(1000)
        values.Add(5000)
        values.Add(25000)
        values.Add(35000)
        values.Add(75000)

        Dim i As Integer

        For i = 0 To 4
            Dim RandomClass As New Random()
            Dim RandomNumber As Integer
            RandomNumber = RandomClass.Next(0, 4)

            'assigning a box a random value form the list
            box(i) = values(RandomNumber)

            'removing that value from the list
            values.RemoveAt(i)
        Next

        Console.WriteLine("Box 1 = " & box(0))
        Console.WriteLine("Box 2 = " & box(1))
        Console.WriteLine("Box 3 = " & box(2))
        Console.WriteLine("Box 4 = " & box(3))
        Console.WriteLine("Box 5 = " & box(4))

        Console.Read()
当我尝试运行应用程序时,VB不断返回此错误消息:

指数超出范围。必须是非负数且小于集合的大小。参数名称:index

提前感谢您的任何答案。

2 个答案:

答案 0 :(得分:1)

删除项目时,列表的长度会变小。所以在第二个循环中,索引4不再存在。在第三个循环中,3不再存在,依此类推。试试这个:

Dim RandomClass As New Random()
Dim RandomNumber As Integer
For i = 0 To 4
    RandomNumber = RandomClass.Next(0, values.count - 1)

    'assigning a box a random value form the list
    box(i) = values(RandomNumber)

    'removing that value from the list
    values.RemoveAt(i)
Next

答案 1 :(得分:1)

史蒂夫的回答可以防止错误发生,但我认为它仍然没有做到你想要的。 values.RemoveAt(i)将始终在第一次,第二次,下次等时从列表中删除第一项...它不会删除您刚刚放入框中的值。为此,您应该使用values.RemoveAt(RandomNumber)代替。

For i = 0 To 4
    RandomNumber = RandomClass.Next(0, values.count - 1)

    'assigning a box a random value form the list
    box(i) = values(RandomNumber)

    'removing that value from the list
    values.RemoveAt(RandomNumber)
Next