2017-09-28 1 views
-1

My.Computer.FileSystem.GetFiles는 "디렉터리 내의 파일 이름을 나타내는 문자열의 읽기 전용 컬렉션을 반환합니다."를 반환합니다.vb.net GetFiles에 의해 반환 된 컬렉션에서 파일 이름을 제거하는 방법

임의로 파일을 컬렉션에서 선택하여 처리하고 목록에서 삭제 한 다음 모든 파일이 처리 될 때까지 반복하고 싶습니다.

나는 GetFiles에서 변경 가능한 컬렉션으로 만 컬렉션을 복사하는 것으로 생각할 수 있습니다. 그러나 GetFiles는 결국 수백만 개의 파일 이름을 반환 할 수 있습니다.

답변

4

함수 호출이 끝날 때 .ToList()을 넣으면됩니다.

목록의 중간에서 임의로 항목을 선택하는 대신 목록을 다시 셔플하고 셔플 처리 된 항목을 반복하는 것이 좋습니다. 컬렉션에서 항목을 삭제하는 것보다 쉽습니다. my_mutable_list에서 필요에 따라

+0

Sweet! 좋은 생각이야. 이 경우에 어떤 셔플 방법을 권하고 싶습니까? –

+0

와우, 복잡한 셔플 링이 목록에서 각 파일을 단순히 삭제하는 것보다 더 효율적인지, 연결 목록 인 경우 매우 빠를지 모르겠다. –

+0

그러나'List '은 ** 링크 된 목록이 아닙니다 **입니다. 목록에서 항목을 삭제할 때마다 (List.Remove() 또는 List.RemoveAt() 호출) .Net은 올바른 크기의 새 버퍼를 할당하고 모든 요소를 ​​새 버퍼에 복사합니다. 예, 스스로 셔플을 작성해야합니다. 프레임 워크에는이 상자가 기본적으로 포함되어 있어야합니다 (그러나 Fisher-Yates의 경우 Google 뿐이므로이를 수행하는 방법을 보여주는 많은 예제 코드를 찾을 수 있습니다 지나치게 소란스럽지 않고. –

0

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

그런 다음, 단지 각 파일을 삭제합니다. 이 일반적인 기능을 사용

1

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 

그런 다음 셔플 목록을 반복 할 수 Fisher-Yates Shuffle에 따라 셔플한다. iterating 경우 항목을 제거 할 필요가 없습니다.

Dim source = My.Computer.FileSystem.GetFiles("C:/") 
Dim result = Shuffle(source) 
For Each r In result 
    ' process file 
Next 
관련 문제