My.Computer.FileSystem.GetFiles返回“返回表示目录中文件名的字符串的只读集合。”
我想在集合中随机选择一个文件,处理它,从列表中删除它,然后重复直到处理完所有文件。
我可以想到只将GetFiles中的集合复制到一个可变集合中。 但GetFiles最终可能会返回数百万个文件名。
答案 0 :(得分:4)
只需在函数调用结束时放置一个.ToList()
。
我不建议从列表中间随机选择项目,而是建议改组列表并迭代洗牌项目。这比从集合中删除项目更容易。
答案 1 :(得分:1)
使用此通用函数根据Fisher-Yates Shuffle
进行随机播放Shared r = New Random() ' must not create new Random each time
Public Shared Function Shuffle(Of T)(source As IEnumerable(Of T)) As IEnumerable(Of T)
Dim n = source.Count()
Dim a(n - 1) As T
For i = 0 To n - 1
Dim j = r.Next(0, i + 1)
If i <> j Then
a(i) = a(j)
End If
a(j) = source(i)
Next
Return a
End Function
然后您可以遍历洗牌列表。如果迭代,则无需删除项目。
Dim source = My.Computer.FileSystem.GetFiles("C:/")
Dim result = Shuffle(source)
For Each r In result
' process file
Next
答案 2 :(得分:0)
my_mutable_list = My.Computer.FileSystem.GetFiles(my_dir_path).ToList()
然后,只需从my_mutable_list中删除每个文件。