Правильный способ отображения вывода из цикла for в метке

#wpf #vb.net

Вопрос:

привет, у меня есть код, который может преобразовывать строчные буквы каждого элемента строкового массива с помощью цикла 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("")  

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

Яблочно-вишневый

Комментарии:

1. И что вы ожидаете здесь увидеть? Я не вижу никакой метки, измененной этим кодом.

2. я изменил код, похоже, я опубликовал неполный код, не могли бы вы проверить его, пожалуйста?

3. мне просто нужно, чтобы значение внутри цикла for было доступно

Ответ №1:

Вам не нужно явно определять Char массив. Строка имеет Char(index) свойство, которое является Default свойством. Мы можем использовать это непосредственно в строке. MyString(index)

Мы присваиваем новое String , возвращаемое Replace методом, элементу массива. 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, но код, который вас интересует, не должен отличаться, просто формат процедуры события.

Комментарии:

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

Ответ №2:

Вы даже можете сделать это в одной строке без явного цикла.

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

Хотя это кажется очень «умным», есть несколько вещей, которые следует учитывать.

  • Если исходный список очень большой (то есть тысячи строк), это менее эффективно, потому что выбор Linq и последующее объединение создадут новый список, удвоив объем используемой памяти.
  • Если вы хотите изменить больше, чем первый символ, метод ToTitleCase не может работать

Комментарии:

1. тогда мне нужно было бы рассмотреть возможность использования этого, хотя бы для небольших строк?

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