Цикл рекурсивный для каждого, кажется, не рекурсивно правильно - PullRequest
2 голосов
/ 29 июля 2011

По некоторым причинам, кажется, что внешний блок не обновляется рекурсивно, как я ожидал.Я хочу, чтобы циклы добавили все каталоги в пределах "C:\Users\Drise" в массив internaldirs().Какой-нибудь совет относительно правильного способа сделать это, поскольку кажется, что я делаю это неправильно?

Static internaldirs() As String

internaldirs.add("C:\Users\Drise")

For Each internaldir As String In internaldirs
    For Each direc As String In Directory.GetDirectories(internaldir)
        internaldirs.Add(direc)
    Next
Next

Решение:

Sub recursivedirs()
    Static internaldirs As New List(Of String)
    Try
        If internaldirs(0) = "C:\Users\Drise" Then
            Call AddDirToList(internaldirs, internaldirs(0))
        End If
    Catch
        internaldirs.Add("C:\Users\Drise")
        Call AddDirToList(internaldirs, internaldirs(0))
    End Try

End Sub

Private Sub AddDirToList(ByRef dirs As List(Of String), ByVal currentDir As String)
    dirs.Add(currentDir)
    Try
        For Each subDir As String In Directory.GetDirectories(currentDir)
            AddDirToList(dirs, subDir)
        Next
    Catch
    End Try

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Краткий ответ: вы не можете изменить коллекцию (internaldirs), для которой вы выполняете итерацию.

Более длинный ответ: похоже, вы пытаетесь создать строковый массив со списком папки в каталогедерево.Лучшим способом было бы использовать List и рекурсивную функцию.

Static dirs As List(Of String)

dirs = New List(Of String)
AddDirToList(dirs, "C:\Users\Drise")


Private Sub AddDirToList (dirs as List(Of String), currentDir as String) 
    dirs.Add(currentDir)
    For Each subDir As String In Directory.GetDirectories(currentDir) 
        AddDirToList(dirs, currentDir)
    Next
End Sub

Пожалуйста, извините за любые синтаксические проблемы.Я больше из C # парня.

0 голосов
/ 29 июля 2011

Как сказал Эндрю Купер, вы не можете изменять коллекцию, используемую в цикле For Each.

Вы можете сделать это с помощью счетчика индекса.

Dim internaldir As List(Of String)
internaldir.Add("C:\Users\Drise")
Dim i As Integer = 0
Do Until i >= internaldir.Count
    Dim internaldir As String = internaldirs(i)
    For Each currentdir As String In Directory.GetDirectories(internaldir)
        internaldirs.Add(currentdir)
    Next
    i += 1
Loop
' If you want an array as output, use:
Dim array As String() = internaldirs.ToArray()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...