2016-05-18 4 views
0

Что я хочу сделать, это заменить все «A» в строке на «Bb». но он будет только цикл с исходной строкой, а не с новой строкой.Для Loop: изменение условия цикла при его циклировании

, например:

AAA
BbAA
BbBbA

и останавливается там, потому что исходная строка имеет только длину 3. он читает только до 3-го индекса, а не остальные.

Dim txt As String 
    txt = output_text.Text 

    Dim a As String = a_equi.Text 

    Dim index As Integer = txt.Length - 1 
    Dim output As String = "" 

    For i = 0 To index 
     If (txt(i) = TextBox1.Text) Then 
      output = txt.Remove(i, 1).Insert(i, a) 
      txt = output 
      TextBox2.Text += txt + Environment.NewLine 

     End If 
    Next 
End Sub 
+2

Вы пытались встроить функцию vb.net для замены строки output = input.Replace («A», «Bb») –

+0

Используйте StringBuilder и создайте новую строку, добавляющую строку подстановки или текущий символ. Не пытайтесь заменить одну строку ввода. – Steve

+0

Можете ли вы не просто использовать цикл while? .. Вы можете сделать все, что хотите, и изменить строки, которые хотите, а затем выйти из цикла, как только будете удовлетворены. – nora

ответ

0

Я думаю, что это оставляет нас ищет String.ReplaceFirst функции. Поскольку их нет, мы можем просто написать эту функцию. Тогда код, который называет это становится гораздо более удобным для чтения, потому что это быстро очевидно, что он делает (от имени функции.)

Public Function ReplaceFirst(searched As String, target As String, replacement As String) As String 

    'This input validation is just for completeness. 
    'It's not strictly necessary. 

    'If the searched string is "null", throw an exception. 
    If (searched Is Nothing) Then Throw New ArgumentNullException("searched") 

    'If the target string is "null", throw an exception. 
    If (target Is Nothing) Then Throw New ArgumentNullException("target") 

    'If the searched string doesn't contain the target string at all 
    'then just return it - were done. 
    Dim foundIndex As Integer = searched.IndexOf(target) 
    If (foundIndex = -1) Then Return searched 

    'Build a new string that replaces the target with the replacement. 
    Return String.Concat(searched.Substring(0, foundIndex), replacement, _ 
     searched.Substring(foundIndex + target.Length, searched.Length - (foundIndex + target.Length))) 
End Function 

Обратите внимание, как, когда вы читаете код, приведенный ниже, вы даже не придется тратить мгновенно пытаясь понять, что он делает. Это читаемо. Пока строка ввода содержит «A», замените первый «A» на «Bb».

Dim input as string = "AAA" 
While input.IndexOf("A") > -1 
    input = input.ReplaceFirst(input,"A","Bb") 
    'If you need to capture individual values of "input" as it changes 
    'add them to a list. 
End While 

Вы можете оптимизировать или полностью заменить функцию. Важно то, что ваш код читабельен, кто-то может сказать, что он делает, и функция ReplaceFirst может быть тестируемой.

Тогда, скажем, вы хотите еще одну функцию, которая дала вам все «версии» вашей входной строки как целевая строка заменяется:

Public Function GetIterativeReplacements(searched As String, target As String, replacement As String) As List(of string) 
    Dim output As New List(Of String) 
    While searched.IndexOf(target) > -1 
     searched = ReplaceFirst(searched, target, replacement) 
     output.Add(searched) 
    End While 
    Return output 
End Function 

Если вы звоните

dim output as List(of string) = GetIterativeReplacments("AAAA","A","Bb") 

Это собирается вернуть список строк, содержащих

BbAAA, BbBbAA, BbBbBbA, BbBbBbBb 

Это почти всегда хорошо для киев p методы короткие. Если они начинают становиться слишком длинными, просто разделите их на более мелкие методы с четкими именами. Таким образом, вы не пытаетесь читать и следовать и проверять одну большую длинную функцию. Это сложно, будь вы новым программистом. Трюк не способен создавать длинные сложные функции, которые мы понимаем, потому что мы их написали, - это создает небольшие, более простые функции, которые каждый может понять.

+0

Большое вам спасибо за это! Я выполнил свою программу. – MazoKisto

0

Проверьте свои комментарии для лучшего решения, но в будущем вы должны использовать время цикл вместо для цикла, если ваше состояние будет меняться, и вы, желающими принять эти изменения во внимание.

Я сделал простой пример ниже, чтобы помочь вам разобраться. Если вы пробовали то же самое с для цикла, вы получите только «один», «два» и «три» напечатаны, потому что цикл не «видеть», что vals был изменен

Dim vals As New List(Of String) 
    vals.Add("one") 
    vals.Add("two") 
    vals.Add("three") 

    Dim i As Integer = 0 
    While i < vals.Count 
     Console.WriteLine(vals(i)) 
     If vals(i) = "two" Then 
      vals.Add("four") 
      vals.Add("five") 
     End If 
     i += 1 
    End While 
+0

Как использовать цикл while для изменения условия? – MazoKisto

0

Я собирался написать цикл время, чтобы ответить на ваш вопрос, но понял, что (при содействии со стороны других), что вы могли бы просто .replace(x,y)

Output.Text = Input.Text.Replace("A", "Bb") 

'Input = N A T O 
'Output = N Bb T O 

Edit: Существует, вероятно, лучший вариант, но я быстро набросал эту петлю вниз, надежду помогает.

Вы сказали свое новое и не совсем понимаете while loops. Поэтому, если вы не поймете functions или как pass arguments им, я бы предложил посмотреть, что тоже.

Это ваше событие, это может быть изменение кнопки или текстовое поле.

'Cut & Paste into an Event (Change textboxes to whatever you have input/output) 

    Dim Input As String = textbox1.Text 

    Do While Input.Contains("A") 

     Input = ChangeString(Input, "A", "Bb") 

     ' Do whatever you like with each return of ChangeString() here 

    Loop 

    textbox2.Text = Input 

Это ваша функция, с 3-мя аргументами и возвращаемое значение, которое может быть вызвана в вашем коде

' Cut & Paste into Code somewhere (not inside another sub/Function) 
Private Function ChangeString(Input As String, LookFor As Char, ReplaceWith As String) 

    Dim Output As String = Nothing 
    Dim cFlag As Boolean = False 

    For i As Integer = 0 To Input.Length - 1 
     Dim c As Char = Input(i) 

     If (c = LookFor) AndAlso (cFlag = False) Then 
      Output += ReplaceWith 
      cFlag = True 
     Else 
      Output += c 
     End If 

    Next 

    Console.WriteLine("Output: " & Output) 
    Return Output 

End Function 
+0

это заменит все «A» одновременно. Я хочу сделать это один за другим. – MazoKisto

+0

Не уверен, что изменения в ваших сообщениях изменились или нет, но я отредактировал свой ответ в соответствии с вашими требованиями. Протестировано и работает. Вы можете удалить цикл While, если вы просто хотите сделать это вручную снова и снова, он удалит и заменит все, что вы укажете в качестве аргументов. – nora

0

Если вы хотите заменить один за другим, вместо того, чтобы использовать Заменить функции, вы можете использовать цикл while для поиска индекса вашего символа/строки поиска, а затем заменить/вставить в этот индекс.

Sub Main() 
    Dim a As String = String.Empty 
    Dim b As String = String.Empty 
    Dim c As String = String.Empty 
    Dim d As Int32 = -1 
    Console.Write("Whole string: ") 
    a = Console.ReadLine() 
    Console.Write("Replace: ") 
    b = Console.ReadLine() 
    Console.Write("Replace with: ") 
    c = Console.ReadLine() 

    d = a.IndexOf(b) 
    While d > -1 
     a = a.Remove(d, b.Length) 
     a = a.Insert(d, c) 
     d = a.LastIndexOf(b) 
    End While 
    Console.WriteLine("Finished string: " & a) 
    Console.ReadLine() 
End Sub 

Вывод будет выглядеть следующим образом:

Whole string: This is A string for replAcing chArActers. 
Replace: A 
Replace with: Bb 
Finished string: This is Bb string for replBbcing chBbrBbcters.