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