2017-09-28 7 views
-1

My.Computer.FileSystem.GetFilesは "ディレクトリ内のファイル名を表す文字列の読み取り専用コレクションを返します。vb.net GetFilesから返されたコレクションからファイル名を削除するには

ランダムにコレクション内のファイルを選択して処理し、リストから削除し、すべてのファイルが処理されるまで繰り返します。

コレクションをGetFilesから変更可能なコレクションにコピーすることしか考えられません。 しかし、GetFilesは最終的には何百万というファイル名を返している可能性があります。

答えて

4

.ToList()を関数呼び出しの最後に置くだけです。

リストの途中からランダムにアイテムを選択するのではなく、リストをシャッフルしてシャッフルしたアイテムを繰り返すことをお勧めします。コレクションからアイテムを削除するより簡単になります。

+0

Sweet!いい案。この場合、どのようなシャッフル方法をお勧めしますか? –

+0

うわー、シャフリングが複雑なのかどうか分からないのは、リストから各ファイルを単に削除するよりも効率的です。 –

+0

ですが、 'List 'は**リンクされていない**です。 List.Remove()またはList.RemoveAt()を呼び出すと、正しいサイズの新しいバッファが割り当てられ、すべての要素が新しいバッファにコピーされます。はい、あなたはあなた自身のシャッフルを書く必要があります - フレームワークは本当にこれを箱の中に入れておくべきです(しかし、フィッシャー・イェイツのためのGoogleだけで、それを行う方法を示すたくさんのサンプルコードが見つかりますあまりにも大騒ぎすることなく。 –

0

my_mutable_list = My.Computer.FileSystem.GetFiles(my_dir_path).ToList()

my_mutable_listから必要に応じてその後、ちょうど各ファイルを削除します。

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 
関連する問題