Оптимизировать код, содержащий вложенные циклы - Visual Basic .NET

  1. Вот код :vb.net1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Dim a As Long         Do             a += 1             Console.WriteLine(a) m1:         If a <> 10000 Then                 Do                     a -= 1                     Console.WriteLine(a)                     If a = 0 Then                         Do                             a += 1                             Console.WriteLine(a)                               If a = 10000 Then                                 Do                                     a += 1                                     Console.WriteLine(a)                                     GoTo m1                                 Loop                             End If                           Loop                     End If                 Loop             End If                 Loop


textual

Код:

m1: for a=1 to 10000: Console.WriteLine(a): Next a
for a=10000 to 1 step -1: Console.WriteLine(a): Next a
goto m1


Похожие ответы
  1. Подскажите, как можно сократить данный код, чтобы не писать 8 раз почти одно тоже (только с сдвигом)? С каждым разом увеличивается номер комбобокса на 1 и текстовые поля на 5vb.net1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26                 If z > 846.15 Then                     If ComboBox1.Text = "SiO2 (ОІ-кварц)" Or ComboBox1.Text = "SiO2 (О±-кварц)" Or ComboBox1.Text = "SiO2 (О±-тридимит)" Or ComboBox1.Text = "SiO2 (ОІ-кристобалит)" Or ComboBox1.Text = "SiO2(к) кварц" Or ComboBox1.Text = "SiO2(к) тридимит" Or ComboBox1.Text = "SiO2(к) кристобалит" Or ComboBox1.Text = "SiO2 (полиморф.)" Then                         TextBox1.Text = halphaSiO2 : TextBox2.Text = salphaSiO2 : TextBox3.Text = aalphaSiO2 : TextBox4.Text = balphaSiO2 : TextBox5.Text = calphaSiO2                     End If                     If ComboBox2.Text = "SiO2 (ОІ-кварц)" Or ComboBox2.Text = "SiO2 (О±-кварц)" Or ComboBox2.Text = "SiO2 (О±-тридимит)" Or ComboBox2.Text = "SiO2 (ОІ-кристобалит)" Or ComboBox2.Text = "SiO2(к) кварц" Or ComboBox2.Text = "SiO2(к) тридимит" Or ComboBox2.Text = "SiO2(к) кристобалит" Or ComboBox2.Text = "SiO2 (полиморф.)" Then                         TextBox6.Text = halphaSiO2 : TextBox7.Text = salphaSiO2 : TextBox8.Text = aalphaSiO2 : TextBox9.Text = balphaSiO2 : TextBox10.Text = calphaSiO2                     End If                     If ComboBox3.Text = "SiO2 (ОІ-кварц)" Or ComboBox3.Text = "SiO2 (О±-кварц)" Or ComboBox3.Text = "SiO2 (О±-тридимит)" Or ComboBox3.Text = "SiO2 (ОІ-кристобалит)" Or ComboBox3.Text = "SiO2(к) кварц" Or ComboBox3.Text = "SiO2(к) тридимит" Or ComboBox3.Text = "SiO2(к) кристобалит" Or ComboBox3.Text = "SiO2 (полиморф.)" Then                         TextBox11.Text = halphaSiO2 : TextBox12.Text = salphaSiO2 : TextBox13.Text = aalphaSiO2 : TextBox14.Text = balphaSiO2 : TextBox15.Text = calphaSiO2                     End If                     If ComboBox4.Text = "SiO2 (ОІ-кварц)" Or ComboBox4.Text = "SiO2 (О±-кварц)" Or ComboBox4.Text = "SiO2 (О±-тридимит)" Or ComboBox4.Text = "SiO2 (ОІ-кристобалит)" Or ComboBox4.Text = "SiO2(к) кварц" Or ComboBox4.Text = "SiO2(к) тридимит" Or ComboBox4.Text = "SiO2(к) кристобалит" Or ComboBox4.Text = "SiO2 (полиморф.)" Then                         TextBox16.Text = halphaSiO2 : TextBox17.Text = salphaSiO2 : TextBox18.Text = aalphaSiO2 : TextBox19.Text = balphaSiO2 : TextBox20.Text = calphaSiO2                     End If                     If ComboBox5.Text = "SiO2 (ОІ-кварц)" Or ComboBox5.Text = "SiO2 (О±-кварц)" Or ComboBox5.Text = "SiO2 (О±-тридимит)" Or ComboBox5.Text = "SiO2 (ОІ-кристобалит)" Or ComboBox5.Text = "SiO2(к) кварц" Or ComboBox5.Text = "SiO2(к) тридимит" Or ComboBox5.Text = "SiO2(к) кристобалит" Or ComboBox5.Text = "SiO2 (полиморф.)" Then                         TextBox21.Text = halphaSiO2 : TextBox22.Text = salphaSiO2 : TextBox23.Text = aalphaSiO2 : TextBox24.Text = balphaSiO2 : TextBox25.Text = calphaSiO2                     End If                     If ComboBox6.Text = "SiO2 (ОІ-кварц)" Or ComboBox6.Text = "SiO2 (О±-кварц)" Or ComboBox6.Text = "SiO2 (О±-тридимит)" Or ComboBox6.Text = "SiO2 (ОІ-кристобалит)" Or ComboBox6.Text = "SiO2(к) кварц" Or ComboBox6.Text = "SiO2(к) тридимит" Or ComboBox6.Text = "SiO2(к) кристобалит" Or ComboBox6.Text = "SiO2 (полиморф.)" Then                         TextBox26.Text = halphaSiO2 : TextBox27.Text = salphaSiO2 : TextBox28.Text = aalphaSiO2 : TextBox29.Text = balphaSiO2 : TextBox30.Text = calphaSiO2                     End If                     If ComboBox7.Text = "SiO2 (ОІ-кварц)" Or ComboBox7.Text = "SiO2 (О±-кварц)" Or ComboBox7.Text = "SiO2 (О±-тридимит)" Or ComboBox7.Text = "SiO2 (ОІ-кристобалит)" Or ComboBox7.Text = "SiO2(к) кварц" Or ComboBox7.Text = "SiO2(к) тридимит" Or ComboBox7.Text = "SiO2(к) кристобалит" Or ComboBox7.Text = "SiO2 (полиморф.)" Then                         TextBox31.Text = halphaSiO2 : TextBox32.Text = salphaSiO2 : TextBox33.Text = aalphaSiO2 : TextBox34.Text = balphaSiO2 : TextBox35.Text = calphaSiO2                     End If                     If ComboBox8.Text = "SiO2 (ОІ-кварц)" Or ComboBox8.Text = "SiO2 (О±-кварц)" Or ComboBox8.Text = "SiO2 (О±-тридимит)" Or ComboBox8.Text = "SiO2 (ОІ-кристобалит)" Or ComboBox8.Text = "SiO2(к) кварц" Or ComboBox8.Text = "SiO2(к) тридимит" Or ComboBox8.Text = "SiO2(к) кристобалит" Or ComboBox8.Text = "SiO2 (полиморф.)" Then                         TextBox36.Text = halphaSiO2 : TextBox37.Text = salphaSiO2 : TextBox38.Text = aalphaSiO2 : TextBox39.Text = balphaSiO2 : TextBox40.Text = calphaSiO2                     End If                 End IfЯ так понимаю тут надо циклом, но не пойму как его прикрутить

  1. Как укоротить код, чтоб можно было добавлять слова для замены? vb.net1 2 3 4 5  ' Удаляем [Ответить], [Ответить с цитатой], [Отменить ответ]         TextBox2.Text = Replace(TextBox2.Text, "[Ответить]", "")         TextBox2.Text = Replace(TextBox2.Text, "[Ответить с цитатой]", "")         TextBox2.Text = Replace(TextBox2.Text, "[Отменить ответ]", "")         TextBox2.Text = Replace(TextBox2.Text, ".ya-page_js_yes .ya-site-form_inited_no { display: none; }", "")

  1. Написал код поиска слов и их выделения цветом в RichTextBox:vb.net1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41              Dim Props() As String = IO.File.ReadAllLines("C:\propertyes.se")          Dim KeyWords() As String = IO.File.ReadAllLines("C:\KeyWords.se")   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click         ColoringAllText(Props, Color.BlueViolet)         ColoringAllText(KeyWords, Color.Blue, True)     End Sub       Sub ColoringAllText(ByVal fWords() As String, ByVal clr As Color, Optional ByVal Blond As Boolean = False)         Dim fInd As Integer         Dim st As Integer         For i = 0 To fWords.Length - 1             st = FindMyText(fWords(i), fInd)             While st <> -1                 fInd = fWords(i).Length + 1 + st                 If RichTextBox1.Text.Substring(IIf(st - 1 < 0, 0, st - 1), 1) <> "_" Then                     RichTextBox1.Select(st, fWords(i).Length)                     RichTextBox1.SelectionColor = clr                       If Blond = True Then RichTextBox1.SelectionFont = New Font(RichTextBox1.SelectionFont, FontStyle.Bold)                       RichTextBox1.SelectionLength = 0                 End If                 st = FindMyText(fWords(i), fInd)               End While             fInd = 0         Next i     End Sub       Public Function FindMyText(ByVal text As String, ByVal start As Integer) As Integer         Dim returnValue As Integer = -1         If text.Length > 0 And start >= 0 And start <= RichTextBox1.Text.Length Then             Dim indexToText As Integer = RichTextBox1.Find(text, start, RichTextBoxFinds.WholeWord)             If indexToText >= 0 Then                 returnValue = indexToText             End If         End If         Return returnValue     End FunctionФункция ColoringAllText получает массив слов, ищет каждое слово по всему тексту и выделяет его цветом, если найдет. Массив содержит всего 300 слов, весь текст весит 50Кб, а программа выделяет слова за ~7 секунд - многовато как-то. Как можно оптимизировать код?

  1. В данном коде два варианта распаковки архива, в текущем потоке и в отдельном потоке. vb.net1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 Imports System.Threading Public Class Form1     ' Запуск процедуры раззиповывания без потока     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click         Dim sh As New Shell32.Shell()         Dim input As Shell32.Folder = sh.NameSpace(Application.StartupPath() & "\1.zip")         Dim output As Shell32.Folder = sh.NameSpace(Application.StartupPath())         output.CopyHere(input.Items, 16) ' оптимальное значение vOptions=16 (Respond with "Yes to All" for any dialog box that is displayed) иначе выдаются сообщения     End Sub     ' Запуск процедуры раззиповывания в отдельном потоке     Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click         StartUnZIP(Application.StartupPath() & "\1.zip", Application.StartupPath())     End Sub     ' Процедура запуска отдельного потока для раззиповывания файла (параметры передаются в поток через структуру RequestParam)     Sub StartUnZIP(ByVal NameFileInput As String, ByVal NameFolderOutput As String)         Dim trdUnZIPThread As New System.Threading.Thread(AddressOf UnZIPThread)         Dim rp As RequestParam = New RequestParam(NameFileInput, NameFolderOutput)         trdUnZIPThread.Start(rp)     End Sub     ' Структура для передачи параметров в поток     Structure RequestParam         Public NameFileInput As String ' путь к архиву         Public NameFolderOutput As String ' конечная папка         Sub New(ByVal NameFileInput As String, ByVal NameFolderOutput As String)             Me.NameFileInput = NameFileInput             Me.NameFolderOutput = NameFolderOutput         End Sub     End Structure     ' Процедура раззиповывания файла (параметры передаются в поток через структуру RequestParam)     Sub UnZIPThread(ByVal obj As Object)         Dim rp As RequestParam = CType(obj, RequestParam)         Dim sh As New Shell32.Shell()         Dim input As Shell32.Folder = sh.NameSpace(rp.NameFileInput) ' путь к архиву         Dim output As Shell32.Folder = sh.NameSpace(rp.NameFolderOutput) ' конечная папка         output.CopyHere(input.Items, 16) ' оптимальное значение vOptions=16 (Respond with "Yes to All" for any dialog box that is displayed) иначе выдаются сообщения     End Sub End ClassЯ использую второй способ, давно, успешно. И вдруг он перестал работать. Я в панике! Пишет вот что Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "Shell32.Shell". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{34936BA1-67AD-4C41-99B8-8C12DFF1E974}" возвратил следующую ошибку: Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)). Я грешу на обновление винды. Причем что интересно, старый исполняемый файл *.exe как работал так и работает, а после новой компиляции уже не работает. Старый и новый файлы *.exe одинакового размера с точностью до байта. Не дайте сойти с ума, помогите!

  1. Привет. Есть 2 формы - One и Second. One с кнопкой, при нажатии на которую для Second происходит Second.Show() В Second на событии загрузки висит подключение к базе. Вот. Когда ээ...управление переходит к Second и выполняются операторы ее, то они выполняются только до момента connection.Open() и далее управление улетает к форме One, где и заканчивается собственно клик по кнопе. Вопрос - почему так? Как момент открытия подключения может служить сигналом а-ла End Sub для загрузки формы?

  1. Помогите довести Калькулятор до идеала а то я первый раз пишу и спросить не у кого ((

  1. Имеем одномерный массив, не отрицательных чисел тина Integer {1, 0, 4, 3}. Нужно найти пропущенное число (в данном случае, число 2). Я накодил так:vb.net1 2 3 4 5 6 7 8 9 10 11 12 'Dim t = New Stopwatch : t.Start() 'For j = 0 To 500000             '[Bebin]             Dim myList As New List(Of Integer)({1, 0, 4, 3}) '  Массив в котором пропущена двойка             myList.Sort() ' Сортируем по возростанию               For i% = 1 To myList.Count - 1                 If myList(i) - myList(i - 1) > 1 Then MsgBox("Пропущено число: " & myList(i) - 1)             Next             '[End] 'Next j 't.Stop() : MsgBox(t.ElapsedMilliseconds) Но предварительная сортировка и линейный поиск не дают желаемой скорости работы, нужно оптимизировать. Может есть что-то типа: Distinct ?Добавлено через 2 часа 16 минут Применение агрегатной функции vb.net1 myList.Aggregate(Function(x, y) If(y - x = 1, y, x)) + 1 желаемого эффекта не даёт, она оказалась медленнее и к тому же находит только первое пропущенное значение в отличии от вышеописанного кода, который находит все пропущенные значения.

  1. Имеется код переделанный из c#, код должен искать значение в datagridview1, первое значение красить красным, последующие рандомным цветом, однако код только ищет значение, изменение цвета текста не пашет, что не так? Код поиска и закрашивания:vb.net1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Private count As Integer = 0     Private Sub button5_Click(sender As Object, e As EventArgs) Handles button5.Click         Dim count As Integer         If textBox1.Text.Equals("") Then             MessageBox.Show("Вы не ввели все необходимые данные!!", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)         Else             System.Math.Max(System.Threading.Interlocked.Increment(count), count - 1)             Dim colorr As Color = func(count)             Dim i As Integer = 0             While i < DataGridView1.ColumnCount                 Dim j As Integer = 0                 While j < DataGridView1.RowCount                     If DataGridView1(i, j).FormattedValue.ToString().Contains(textBox1.Text.Trim()) Then                         DataGridView1.CurrentCell = DataGridView1(i, j)                         If i < DataGridView1.RowCount - 1 Then                             If j < DataGridView1.RowCount - 1 Then                                 DataGridView1(i, j).Style.ForeColor = colorr                             End If                         End If                     End If                     System.Math.Max(System.Threading.Interlocked.Increment(j), j - 1)                 End While                 System.Math.Max(System.Threading.Interlocked.Increment(i), i - 1)             End While         End If     End Sub       Private Function func(count As Integer)         If count = 1 Then             Return Color.Red         End If         Dim rand As New Random()         Return Color.FromArgb(255, rand.[Next](0, 255), rand.[Next](0, 255), rand.[Next](0, 255))     End Function