【问题标题】:VB.net How do I remove items from a list that are already in an arrayVB.net 如何从列表中删除已经在数组中的项目
【发布时间】:2018-10-16 11:00:39
【问题描述】:

所以我正在做交易或不交易,我目前正在尝试随机化哪个案例持有多少金额。目前,我的代码创建了值列表,然后随机化一个选择,然后输入到数组中。然后它将 26 个值输出到控制台。现在,当从列表中选择一个值并将其输入到数组中时,我希望将该值从列表中删除。因此,当循环重复并从列表中选择另一个项目时,它不能再选择在前一个循环中选择的那个。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim i As Integer
    Dim values = New List(Of Integer)({0.5, 1, 2, 5, 10, 15, 25, 50, 80, 100, 500, 750, 1000, 2000, 5000, 10000, 25000, 50000, 80000, 100000, 150000, 250000, 500000, 850000, 1000000, 10000000})
    Dim sselect = New Random()
    Dim cases(25) As Integer

    For i = 0 To cases.Length - 1

        cases(i) = sselect.Next(0, values.Count)
        Console.WriteLine(values(cases(i)))
    Next

End Sub

我尝试使用RemoveAll 然后AddressOf 删除重复值,但它似乎不起作用。

        values.RemoveAll(AddressOf cases)

【问题讨论】:

  • 如果您阅读了System.Random 上的精美手册,有一节讨论了使用Random 进行随机播放的潜在方法。请参阅“从数组或集合中检索唯一元素”部分。
  • 列表的第一个元素 0.5 不是整数。
  • AddressOf 正在寻找方法名称。

标签: arrays vb.net list


【解决方案1】:

您可以在选择金额时使用RemoveAt

删除列表指定索引处的元素。

像这样:

For i = 0 To cases.Length - 1
    cases(i) = sselect.Next(0, values.Count)
    Console.WriteLine(values(cases(i)))
    values.RemoveAt(cases(i))
Next

使用这种方式将立即从列表values 中删除使用的值,这反过来又不允许选择重复的值。

我建议您在迭代之前保留一份原始列表的副本。一种快速简单的方法是在开始时创建两次列表。

Dim values = New List(Of Integer)({0.5, 1, 2, 5, 10, 15, 25, 50, 80, 100, 500, 750, 1000, 2000, 5000, 10000, 25000, 50000, 80000, 100000, 150000, 250000, 500000, 850000, 1000000, 10000000})
Dim original = New List(Of Integer)({0.5, 1, 2, 5, 10, 15, 25, 50, 80, 100, 500, 750, 1000, 2000, 5000, 10000, 25000, 50000, 80000, 100000, 150000, 250000, 500000, 850000, 1000000, 10000000})

values 列表中删除所有这些之后。您仍然可以将它们放在original 列表中。假设您以后会重复使用它们。

【讨论】:

    【解决方案2】:

    有更好的办法:

    Dim rng As New Random
    Dim cases = {0.5, 1, 2, 5, 10, 15, 25, 50, 80, 100, 500, 750, 1000, 2000, 5000, 10000, 25000, 50000, 80000, 100000, 150000, 250000, 500000, 850000, 1000000, 10000000}.OrderBy(Function(dbl) rng.NextDouble()).ToList()
    

    完成!顺便问一下,你打算如何将 0.5 存储在 List(Of Integer) 中?

    编辑:

    在我的原始代码中,最终结果是IEnumerable(Of Double)。我应该添加对ToList 的调用以获得List(Of Double),我现在已经添加了。

    该代码使用隐式类型数组,并且因为其中有一个Double 值,所以该数组被推断为类型Double。所有Integer 值都隐式转换为Doubles。如果您想要 List(Of Decimal) 而不是 List(Of Double),那么只需将 0.5Double 文字)更改为 0.5DDecimal 文字)。

    【讨论】:

    • 是的,我把它从 Integer 改成了 Decimal,这个方法仍然适用于小数吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2017-05-03
    • 2022-08-06
    相关资源
    最近更新 更多