如何使用“For Each”循环修改字符串?

时间:2010-07-21 13:33:13

标签: .net vb.net string loops foreach

       'Why doesn't this work?
    Dim myStrings As String() = New String() {string1, string2, string3,}
    For Each s As String In myStrings
        If String.IsNullOrEmpty(s) Then
            s = ""
        End If
        s = "-" & s.Trim() & "-"
    Next

如果string1包含"foo",我的意图是在循环执行后string1包含"-foo-"。我怎样才能做到这一点?

我猜这个代码会复制我的字符串并修改它们。如何在循环中修改字符串?

更新我修改了代码以使用数组索引:

    ' It still doesn't work.
    Dim myStrings As String() = New String() {string1, string2, string3}
    For i As Integer = 0 To myStrings.Count() - 1
        If String.IsNullOrEmpty(myStringss(i)) Then
            myStringss(i) = ""
        End If
        myStrings(i) = "-" & myStrings(i) & "-"
    Next

此代码的结果,特别是指每个元素的数组和索引,修改了数组,但我的字符串仍然具有相同的旧值。显然,初始化这样的数组只是将我的值复制到一个新数组中。如何在循环中修改原始值?

重点:该数组仅用于循环目的。我需要类似地修改string1string2string3,但是一旦这个循环通过,就不再使用数组了。哦,我的真实代码有超过3个字符串。

我只想说,如果我使用的语言包含更多指针和引用,我想我只需要一个指向string1string2, and string3`的指针数组。将这些字符串复制到数组中似乎是多余的。

10 个答案:

答案 0 :(得分:5)

此示例在C#中,但同样的原则适用。

string[] myStrings = new string[] { "temp", "temp2", "temp3" };
myStrings = myStrings.Select(x => "-" + x + "-").ToArray();

输出:

  

“ - temp-”“ - temp2 - ”“ - temp3 - ”

链接到MSDN文章:http://msdn.microsoft.com/en-us/library/bb548891.aspx

您还可以使用委托功能来检查字符串是否为空。将会提供VB解决方案,并在我得到它时进行编辑

编辑:

Dim myStrings As String() = _
        {"apple", "banana", "mango", Nothing, "passionfruit", "grape"}
    myStrings = _
        myStrings.Select(Function(fruit) ("-" & fruit & "-")).ToArray()

输出:

  

“ - apple-”“ - banana-”“ - mango - ”“ - ”   “-passionfruit-”“ - grape - ”

编辑2:与第一次编辑相同但更具可读性

Private Function TESTER(ByVal fruit As String) As String
    Return "-" & fruit & "-"
End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)              Handles MyBase.Load
    Dim myStrings As String() = _
       New String() {"apple", "banana", "mango", Nothing, "passionfruit", "grape"}
    myStrings = _
        myStrings.Select(AddressOf TESTER).ToArray()
End Sub

答案 1 :(得分:3)

使用For / Next,最后myStrings(i) = s保存结果。

答案 2 :(得分:2)

这不起作用,因为字符串在.Net中是不可变的 - 如果没有明确地将string1设置为某个值,则无法更改string1的值,即通过执行以下操作:

string1 = "Blah";

(请注意,您可以使用i而不是for来更改myString数组中foreach字符串值的值,但是从我收集的内容中不是你想做的事情)

要解决您的问题,您需要更好地了解您要解决的问题,例如,您可以通过调整界面来避免以这种方式修改字符串引用(请参阅{{3}为了灵感)

答案 3 :(得分:2)

鉴于您最近的更新,您提出的要求是不可能的。

字符串遵循值语义,因此您对数组中字符串所做的任何操作都不会影响原始字符串。您最接近引用字符串的是StringBuilder,但它并不是特别容易以您想要的方式使用。

你需要后退一步,问问自己为什么要以这种方式做事;换句话说,你的实际目标是什么。一旦你分享了,也许我们可以找到一个有效的解决方案。

答案 4 :(得分:2)

根据集合的性质,您可以在其中存储单位长度数组而不是字符串。如果你这样做,那么你就可以改变每个数组的第0个元素来更新它。

例如,您可以使用Dictionary(Of String,String())将字符串映射到字符串数组。如果单项数组存储在字典中,您可以轻松地更改其中任何一个的第0项,而不会打扰字典。请注意,您不应该使用字典 keys ,因为字典无法根据字符串的内容进行搜索。

顺便说一下,我有时希望有一个集合类,其枚举器会返回一个对象,可以用来请求对集合进行更改而不需要枚举枚举。不知道如何管理这样的事情而不必从头开始编写集合。

答案 5 :(得分:1)

迭代变量是不可变的。使用“经典”循环或其他数组来存储字符串。

答案 6 :(得分:1)

它不起作用,因为字符串是不可变的。

试试这个。

For x As Integer = 0 To myStrings.Length - 1
   myStrings(x) = "new string"
Next

更新后进行修改。

我不确定是否可以这样做。

也许你可以写一个函数?

string1 = MyFunction(string1)

答案 7 :(得分:1)

编辑后,我认为你不能按照你想要的方式做到这一点。我认为你最好将字符串复制到数组并使用数组。而不是有string1,string2等...你有数组[0],数组[1]等......

有什么阻止你这样做吗?

答案 8 :(得分:1)

这可以很容易地封装到ParamArrayByRef参数中,但这不是一个选项
: - (

所以你似乎必须手动完成:

Imports System.Runtime.CompilerServices

Module Module1

Sub Main()
    Dim String1 = "foo"
    Dim String2 = ""
    Dim String3 As String = Nothing
    Dim strings() = New StrongBox(Of String)() {New StrongBox(Of String)(String1), New StrongBox(Of String)(String2), New StrongBox(Of String)(String3)}
    Modify(strings)
    String1 = strings(0).Value
    String2 = strings(1).Value
    String3 = strings(2).Value
    Console.WriteLine("'{0}' '{1}' '{2}'", String1, String2, If(String3, "NOTHING"))
    Console.ReadLine()
End Sub

Sub Modify(ByVal ParamArray myStrings() As StrongBox(Of String))
    For i As Integer = 0 To myStrings.Count() - 1
        If String.IsNullOrEmpty(myStrings(i).Value) Then
            myStrings(i).Value = ""
        End If
        myStrings(i).Value = "-" & myStrings(i).Value & "-"
    Next
End Sub

End Module

编辑:请注意,做这样的事情比较简单(它不提供问题所要求的任何内容):

Module Module1

Sub Main()
    Dim String1 = "foo"
    Dim String2 = ""
    Dim String3 As String = Nothing
    Modify(String1)
    Modify(String2)
    Modify(String3)
    Console.WriteLine("'{0}' '{1}' '{2}'", String1, String2, If(String3, "NOTHING"))
    Console.ReadLine()
End Sub

Sub Modify(ByRef myString As String)
    If String.IsNullOrEmpty(myString) Then
        myString = ""
    End If
    myString = "-" & myString & "-"
End Sub

End Module

答案 9 :(得分:0)

正如@ Justin的评论中所建议的那样,另一种方法是使用Dictionary和VB的With!语法。

Module Module1

Sub Main()
    Dim strings As New Dictionary(Of String, String)
    With strings
        !String1 = "foo"
        !String2 = ""
        !String3 = Nothing
        Console.WriteLine("'{0}' '{1}' '{2}'", !String1, !String2, If(!String3, "NOTHING"))
        Modify(strings)
        Console.WriteLine("'{0}' '{1}' '{2}'", !String1, !String2, If(!String3, "NOTHING"))
        ModifySome(strings, "String1", "String2")
        Console.WriteLine("'{0}' '{1}' '{2}'", !String1, !String2, If(!String3, "NOTHING"))
    End With
    Console.ReadLine()
End Sub

Sub Modify(ByVal myStrings As Dictionary(Of String, String))
    ModifySome(myStrings, myStrings.Keys.ToArray)
End Sub

Sub ModifySome(ByVal myStrings As Dictionary(Of String, String), ByVal ParamArray someStrings() As String)
    For Each s As String In someStrings
        If String.IsNullOrEmpty(myStrings(s)) Then
            myStrings(s) = ""
        End If
        myStrings(s) = "-" & myStrings(s) & "-"
    Next
End Sub

End Module