我正在制作一个程序,该程序从目录中随机选择一个文件(而不是文件夹),并生成一个带有该文件作为文本的消息框。我目前正在使用:
Imports System.IO
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For Each item In Directory.GetFiles("Directory")
Dim filename As String = Path.GetFileName(item)
MsgBox(filename)
Next
End Sub
End Class
但是,这会按照文件在该目录中的顺序(从上到下)打印文件。有什么方法可以随机模式从目录中打印文件?例如,如果目录具有文件F1
,F2
和F3
。我使用的代码按F1
,F2
和F3
的顺序打印出来。而我想要一个以随机顺序打印它们的程序,例如F2
,F1
和F3
。另外,如果可能的话,我只希望程序输出一个文件名并停止,而不希望它不断遍历目录。例如,消息框将显示F2
并关闭,而不是浏览文件列表。
答案 0 :(得分:1)
您可以使用LINQ按随机数生成器生成的随机数排序。
由于LINQ的工作方式,它实际上将为每个条目生成一个随机数并将其缓存,然后按该数字排序。
确保为您的随机数生成器播种。
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim rand As New Random(System.DateTime.Now.Millisecond)
For Each item In Directory.GetFiles("Directory").OrderBy(Function(x) rng.Next())
Dim filename As String = Path.GetFileName(item)
MsgBox(filename)
Next
End Sub
End Class
要仅获取第一个条目,您可以在MsgBox(filename)之后立即中断,或者您可以在随机序列中获取第一个条目...
Dim filename As String = Directory.GetFiles("Directory").OrderBy(Function(x) rng.Next()).First()
MsgBox(filename)
当心.First()将在没有文件的情况下引发异常。 .FirstOrDefault()不会引发异常,而是将字符串设置为null。如果需要此行为,可以在显示消息框之前检查是否为空。
答案 1 :(得分:1)
首先,创建Random
类(在子/事件处理程序之外)的共享实例:
Private Shared Rand As New Random()
然后,您可以使用类似(在您的子/事件处理程序内部)的内容:
Dim files As String() = Directory.GetFiles("C:\Test")
Dim randomIndex As Integer = Rand.Next(files.Count)
MessageBox.Show(files(randomIndex))