.net 如何从指定的目录中随机选取文件?

.net 如何从指定的目录中随机选取文件?,.net,vb.net,.net,Vb.net,我正在制作这个程序,它从目录中随机选取一个文件而不是文件夹,并生成一个以该文件为文本的消息框。我目前正在使用: 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 fil

我正在制作这个程序,它从目录中随机选取一个文件而不是文件夹,并生成一个以该文件为文本的消息框。我目前正在使用:

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并关闭,而不是浏览文件列表。

您可以使用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
要仅获取第一个条目,您可以在MsgBoxfilename之后立即中断,或者只获取随机序列中的第一个条目

Dim filename As String = Directory.GetFiles("Directory").OrderBy(Function(x) rng.Next()).First()
MsgBox(filename)
当心。如果没有文件,First将抛出异常。
.FirstOrDefault不会引发异常,而是将字符串设置为null。如果需要此行为,可以在显示messagebox之前检查null。

首先,在子/事件处理程序外部创建类的共享实例:

作为新随机变量的私有共享Rand 然后,您可以在子/事件处理程序中使用如下内容:

Dim文件格式为String=Directory.GetFilesC:\Test Dim randomIndex为整数=Rand.Nextfiles.Count MessageBox.ShowfilesrandomIndex
OrderBy不是这样工作的。您测试过该代码吗?编辑时添加了lambda函数。OrderBy,我的道歉请确保为您的随机数生成器设置种子。没有理由这样做。在VB 2010中,默认种子已经比当前的毫秒级更随意,但在2015中不是。无论如何,谢谢你的帮助@ay3和版本没关系,两者都可以。在VS2015中尝试此代码时会发生什么?