【问题标题】:How to repeat list(of string) after randomize list index out of range如何在随机列表索引超出范围后重复列表(字符串)
【发布时间】:2017-10-12 05:15:04
【问题描述】:

我是 VB.net 的新手程序员

所以我一直卡在这段代码中,这是用于随机名称生成器。

Private Function RandomLname(ByRef ranLname As String) As String

        Dim reader As StreamReader = My.Computer.FileSystem.OpenTextFileReader("[pathto file.txt]", Encoding.Default)
        Dim lines As New List(Of String)
        Dim rnd As New Random()
        Dim line As Integer
        While reader.Peek <> -1
            lines.Add(reader.ReadLine())
        End While

        line = rnd.Next(lines.Count + 1)
        'the error shown in this line
        ranLname = lines(line)
        Return ranLname
        reader.Close()
        reader.Dispose()

    End Function

运行几次后我不断收到 ArgumentOutOfRangeException 异常,有人可以帮我吗? 我需要脚本在到达 list.count 时再次从头开始读取列表。有人知道吗?

任何帮助将不胜感激。

【问题讨论】:

  • 试试line = rnd.Next(lines.Count)
  • 您的代码存在重大缺陷,因为您在 Return 语句之后关闭了文本文件,即您根本没有关闭它。您应该使用Using 语句打开它,然后无论方法如何结束,它都会隐式关闭。
  • 我已经删除了 reader.Close() 和 reader.Dispose() 但它不会重新列出列表。即使我删除(+ 1),该列表在写入 60 多个结果后也不会产生任何结果
  • reader.Close()reader.Dispose() 都做同样的事情,你只需要调用其中的一个。但是它们永远不会执行,因为函数在Return 处退出。就像 jmcilhinney 所说,您应该将 reader 包装在 Using block 中,并删除 Close()Dispose() 调用。
  • 我明白了,顺便说一句,您如何从列表中排除/删除已使用的字符串?

标签: vb.net exception


【解决方案1】:

这个:

line = rnd.Next(lines.Count + 1)

应该是这样的:

line = rnd.Next(lines.Count)

调用Random.Next时,上限是排他的,集合中的最大索引比Count小1。

【讨论】:

  • 当达到上限时,我该怎么做才能从头开始读取列表?坚持这一点。因为我的列表包含 148 个名字,所以我使用随机来获得 2 个名字作为情侣。但是当它应该在 74 对夫妇中完成时,脚本会在 60 多对夫妇之后运行。有什么想法吗?
  • 如果您有新问题要问,请提出新问题。不要把它捎带在这个上面。
【解决方案2】:

试试这个:

Private Function RandomLname() As String

    Dim reader As StreamReader = My.Computer.FileSystem.OpenTextFileReader("[pathto file.txt]", Encoding.Default)
    Dim lines As New List(Of String)
    Dim rnd As New Random()
    Dim line As Integer
    While reader.Peek <> -1
        lines.Add(reader.ReadLine())
    End While

    line = rnd.Next(lines.Count)
    Return lines(line)
    reader.Close()
    reader.Dispose()

End Function

这里有一个更简单的实现:

Private rnd As New Random()
Private Function RandomLname() As String
    Return File.ReadAllLines("[pathto file.txt]").OrderBy(Function(x) rnd.Next()).FirstOrDefault()
End Function

【讨论】:

    猜你喜欢
    • 2015-06-20
    • 2022-09-27
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2023-02-08
    • 2019-09-22
    • 2016-02-14
    相关资源
    最近更新 更多