2015-07-02 2 views
-2

Я работаю над проектом, в котором я читал файлы кода VB.net в файле List(Of File) (Файл является настраиваемым классом), а затем я просматриваю объект Code (код List(Of String)) каждого файла.Loop through array and insert items

Что я хочу делать в этом цикле, это добавить случайный код, но у меня есть довольно много проблем, чтобы выяснить, как правильно сделать эту работу.

Проблема в том, что код вставляется в местах, где я не хочу, чтобы они были вставлены.

Я попробовал несколько различных способов сделать это:

  1. Просто пробегаем по свойству кода и добавления строки, если условия являются правильными.

  2. Добавляем другое свойство: Public Indices As List(Of Integer), затем перебираем его и вставляем строки в свойство кода, используя новые значения свойств.

  3. Добавление другого свойства: Public InsertionLoopCode As List(Of String), присвоив ему свойство кода, а затем цикл с помощью нового свойства и добавление строки в свойстве Код

Что код выглядит как:

For Each Folder As Folder In Folders 
    For Each File As File In Folder.Files 
     For i = 0 To File.InsertionLoopCode.Count - 1 
      If File.InsertionLoopCode(i).Contains(" Sub ") AndAlso Not File.InsertionLoopCode(i).Contains("Delegate") Then 
       StartSub = True 
      ElseIf File.InsertionLoopCode(i).Contains("End Sub") Then 
       StartSub = False 
      ElseIf StartSub = True AndAlso Not File.InsertionLoopCode(i).Contains(" Sub ") Then 
       If i Mod Randomization.Random.Next(1, 5) = 0 Then 
        Dim RandomNumber As Integer = Random.Next(0, 2) 

        If RandomNumber = 0 Then 
         'File.Code.Insert(i, Insertion.InsertVariable(False)) 
        ElseIf RandomNumber = 1 Then 
         InsertForLoop(File, i) 
        ElseIf RandomNumber = 2 Then 

        End If 
       End If 
      End If 
     Next 
    Next 
Next 

Я не думаю, что это условный оператор или, по крайней мере, не только это, так как он отлично работает, когда я не вставляю строки, а делаю только сообщения msg или записываю их на консоль.

EDIT: Чтобы сделать его более понятным. До:

Module Main 
    Dim WithEvents PlayerReader As New BackgroundWorker 

    Sub Main() 
     Console.ReadLine() 
    End Sub 

    Dim Player As New Player 
    Dim Enemy(64) As Enemy 
    Private Sub PlayerReader_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles PlayerReader.DoWork 
     While True 
      Player.GetInformation() 
      Player.CheckState() 

      For i = 0 To 64 - 1 
       Enemy(i).GetInformation(Player, i) 

       If Player.Health > 0 Then 
        If Player.Team <> Enemy(i).Team AndAlso Enemy(i).Health > 0 Then 
         Console.WriteLine(Enemy.Name) 
        End If 
       End If 
      Next 
     End While 
    End Sub 
End Module 

После:

Module Main 
    Dim WithEvents PlayerReader As New BackgroundWorker 
    *Dim awdasndwand As Integer = 29* 'Supposed to be Italic 

    Sub Main() 
     Console.ReadLine() 
     **Dim yumngsef As String** 'Supposed to be Bold 
    End Sub 

    Dim Player As New Player 
    Dim Enemy(64) As Enemy 
    Private Sub PlayerReader_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles PlayerReader.DoWork 
     While True 
      Player.GetInformation() 
      Player.CheckState() 

      For i = 0 To 64 - 1 
       Enemy(i).GetInformation(Player, i) 

       If Player.Health > 0 Then 
        If Player.Team <> Enemy(i).Team AndAlso Enemy(i).Health > 0 Then 
         Console.WriteLine(Enemy.Name) 
        End If 
       End If 
      Next 
     End While 
    End Sub 
End Module 

Смелый должен быть там, но наклонным нет. Другое дело, что если у меня есть только несколько файлов или я думаю, некоторые конкретные файлы, это работает просто отлично. Как только я прочитаю все решение, оно будет вставлять переменные в неправильные места.

Иисус Христос, почему этот пост получает минусовые баллы? Как насчет того, чтобы быть рывком и нисходящим голосованием, как насчет того, чтобы комментировать проблему?

+1

Трудно понять, что именно вы хотите здесь. Можете ли вы дать (простой, короткий) пример того, что код, который вы читаете и изменяете, выглядит до и после того, как вы его изменили? И, желательно, пример того, что пойдет не так? – Kjartan

+0

Я внесла некоторые изменения в мой оригинальный пост, пожалуйста, взгляните еще раз. – Helios

ответ

0

Я думаю, что поданные голоса пришли, потому что вопрос был неясным. Вы явно приложили много усилий, чтобы объяснить свою проблему, но многое из того, что вы описываете, - это свойства пользовательского класса, который вы не разделили. Попробуйте ответить (или, по крайней мере, прочитать и посмотреть, понимаете ли вы) какие-то вопросы других людей, и это должно помочь вам лучше понять, когда вопрос или не сообщается четко.

В любом случае, хотя я думаю, что ваша проблема проистекает из кода, который мы фактически не видим, у меня есть догадка о том, что вызывает его. Ваши до и после указывают, что, когда вы достигнете сегмента кода, который вы опубликовали, StartSub уже True. Вероятно, это связано с объемом переменной; вероятно, первый File обрабатывается правильно, но поскольку StartSub объявлен за пределами вашего цикла For, он не повторно инициализируется для каждого нового File.Ваш код должен установить StartSub на номер False, когда он встречает линию End Sub, но если предыдущая File не указала эту строку или не поняла, это может отбросить вас. Посмотрите, добавляет ли StartSub = False перед For i = 0... проблема.

Также обратите внимание, что если строка в любом File имеет конечное пространство после End Sub, вы получите неожиданные результаты, так как ваш код никогда не будет проверять «End Sub», потому что он уже найдет «Sub» в той же строке , Если ваш пользовательский класс позаботится об этом, отлично. Если нет, изменение первого заявления If на If File.InsertionLoopCode(i) Like "*Sub ?*" даст вам более безопасные результаты, так как это обеспечит некоторый тип текста после слова «Суб».

И на заметке Meta вы наверняка поняли, что код форматирования (полужирный/курсив) не будет работать внутри текста, уже отформатированного как код.

+0

Спасибо, что посмотрели мой пост. Я не видел причин для публикации классов, поскольку они не являются проблемой и не нужны для ее решения. Я знаю это, потому что, читая файлы кода проектов, отлично работает, я могу без ошибок или предупреждений рандомизировать каждое имя переменной, подзаголовок/вызов, имя/вызов функции и т. Д. И строить решение. – Helios

+0

То, что ** StartSub ** уже верно при продолжении работы с другим файлом, не должно быть возможным, поскольку, как я уже говорил, файлы в порядке, и я проверил это, используя поля msg и записывая их на консоль. Однако, после проверки вашего предложения, он работает! Спасибо, мужик. Я действительно не понимаю, почему это происходит, если вам тоже захочется исправить это, все, что вам нужно сделать, это создать переменную типа «List (Of String), пропустить файл кода и добавить каждую строку в массив, а затем просто скопируйте код из моего сообщения и попробуйте его. – Helios

+0

О контенте, как правило, вы правы, но поскольку визуальная студия автоматически удаляет любые пробелы после окончания строки, это не проблема. – Helios