【问题标题】:Correct way to show an output from for loop in a label在标签中显示 for 循环输出的正确方法
【发布时间】:2021-10-30 19:16:29
【问题描述】:

嗨,我有一个代码可以使用 for 循环转换字符串数组的每个元素的小写字母。问题是只有最后一个元素出现在输出(标签)上,但在调试输出上显示正常

    Dim lst() = {"apple", "banana", "cherry"}

    For Each item As String In lst
        Dim array() As Char = item.ToCharArray
        array(0) = Char.ToUpper(array(0))

        Dim newS = New String(array)
        Dim value As String = String.Join("/", newS)
        TextBox1.Text = value
        Debug.Write(value)

        Output.Text = value
    Next
    Debug.WriteLine("")

这是发生的问题,它将标签更改为最后一个带有大写字母的元素,但是 我希望输出与调试输出相同

苹果香蕉樱桃

【问题讨论】:

  • 您希望在这里发生什么?我看不到该代码更改了任何标签。
  • 我改了代码,好像我贴的代码不完整,可以看看吗?
  • 我只需要访问 for 循环中的值

标签: wpf vb.net


【解决方案1】:

您不需要显式定义Char 数组。字符串具有Char(index) 属性,即Default 属性。我们可以直接在字符串上使用它。 MyString(index)

我们将Replace 方法返回的新String 分配给数组的一个元素。 index 开始于 0,整数的默认值,并在 For Each 循环的每次迭代中递增。

最后,在For Each 之后,我们将Join 分配给标签。

您的代码以及出错的地方。

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    Dim lst() = {"apple", "banana", "cherry"}

    For Each item As String In lst
        Dim array() As Char = item.ToCharArray
        array(0) = Char.ToUpper(array(0))

        Dim newS = New String(array)
        Dim value As String = String.Join("/", newS)
        TextBox1.Text = value 'Overwrites the last value you assigned to the Text property
        Debug.Write(value) 'Adds on to the last value it wrote in the debug window.

        Label1.Text = value 'Overwrites the last value you assigned to the Text property
    Next
    Debug.WriteLine("")
End Sub

更正的代码。

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim lst = {"apple", "banana", "cherry"}
    Dim index As Integer
    For Each item As String In lst
        lst(index) = item.Replace(item(0), Char.ToUpper(item(0)))
        index += 1
    Next
    Label1.Text = String.Join("", lst)
End Sub

这是 WinForms 但您关心的代码应该没有什么不同,只是 Event 过程格式。

【讨论】:

  • 我在使用 for 循环时有点困惑,谢谢你我应该阅读更多关于这个的内容
【解决方案2】:

您甚至可以在没有显式循环的情况下将其放在一行中。

Dim lst = {"apple", "banana", "cherry"}
Output.Text = String.Join("", lst.Select(Function(x) CultureInfo.CurrentCulture.TextInfo.ToTitleCase(x))))

虽然它看起来很“聪明”,但有几件事需要考虑。

  • 如果原始列表非常大(意味着数千个字符串)这个 效率较低,因为 Linq Select 和随后的 Join 将创建一个新列表,使所用内存增加一倍。

  • 如果您想更改的不仅仅是第一个字符,则 ToTitleCase 方法不行

【讨论】:

  • 那么我需要考虑使用这个,如果只是用于小字符串?
  • 这取决于您对小的定义。可能对于包含数百个字符串的列表不会有实质性的区别,对于更多的字符串,应该使用 StopWatch 类进行某种基准测试。
猜你喜欢
  • 2021-10-29
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多