1

У меня есть цикл:

string[] lines = File.ReadAllLines(@"F:\VS Projects\Со звёздочкой\diceware.txt");
for ( int i = 0; i <= lines.Length; i++)
{
                char[] textByCharacter = lines[i].ToCharArray();
                int number = object1.CharacterCheck(textByCharacter[0]);
            if (number == 1)
            {
                textBox1.AppendText(lines[i] + &quot;\t\t&quot;);

            }

            if (number == 2)
            {
                textBox2.AppendText(lines[i] + &quot;\t\t&quot;);
            }

            if (number == 3)
            {
                textBox3.AppendText(lines[i] + &quot;\t\t&quot;);
            }

            if (number == 4)
            {
                textBox4.AppendText(lines[i] + &quot;\t\t&quot;);
            }

            if (number == 5)
            {
                textBox5.AppendText(lines[i] + &quot;\t\t&quot;);
            }

            if (number == 6)
            {
                textBox6.AppendText(lines[i] + &quot;\t\t&quot;);
            }
        }

В этом цикле у меня по очереди заполняется каждый из шести textBox. Как реализовать, чтоб они заполнялись одновременно? Метод определения переменной number:

public int CharacterCheck(char character)
        {
            string symbol = System.Convert.ToString(character);
        if (symbol == &quot;1&quot;)
        {
            transmitsTheNumber = 1;
        }

        if (symbol == &quot;2&quot;)
        {
            transmitsTheNumber = 2;
        }

        if (symbol == &quot;3&quot;)
        {
            transmitsTheNumber = 3;
        }

        if (symbol == &quot;4&quot;)
        {
            transmitsTheNumber = 4;
        }

        if (symbol == &quot;5&quot;)
        {
            transmitsTheNumber = 5;
        }

        if (symbol == &quot;6&quot;)
        {
            transmitsTheNumber = 6;
        }

        return transmitsTheNumber;
    }

  • Что значит одновременно? Типа сначала вычислить все слова, а потом готовый результат записать в текстбоксы, чтобы было не видно, как они наполняются, так чтоли? – aepot Nov 04 '20 at 11:06
  • Можно за один раз определить все слова, а потом одновременно чтоб они записывались в textBox'ы – Ярослав Овчар Nov 04 '20 at 11:27
  • Кстати, для чего вам \t\t? Если для перевода на новую строку за счет небольшой ширины текстбокса, то попробуйте \r\n, это и есть сам переход на новую строку, или есть переменная окружения, содержащая то же самое Environment.NewLine. – aepot Nov 04 '20 at 11:42

1 Answers1

1

Во-первых, кучу однотипных if-else можно оформить через switch-case. Во-вторых, можно сделать лучше.

public int CharacterCheck(char character)
{
    if (int.TryParse(character.ToString(), out int digit) && digit > 0 && digit < 7)
    {
        return digit;
    }
    return 0;
}

К символам в строке можно обращаться напрямую без преобразования в массив символов.

string[] results = Enumerable.Repeat(string.Empty, 6).ToArray(); // массив пустых строк
for (int i = 0; i < lines.Length; i++)
{
    int number = object1.CharacterCheck(lines[i][0]);
    if (number != 0)
        results[number - 1] += lines[i] + "\t\t";
}
textBox1.Text = results[0];
textBox2.Text = results[1];
textBox3.Text = results[2];
textBox4.Text = results[3];
textBox5.Text = results[4];
textBox6.Text = results[5];

Многпоточные вычисления здесь имеют очень мало смысла, потому что, как вы сказали, 6000 строк - это очень мало, и выполнится очень быстро. Во-вторых здесь можно еще ускорить код. В-третьих у вас было 6000 обращений к текстбоксам, стало в 1000 раз меньше. И в-четвертых отрисовка формы может быть ускорена с помощью двойной буферизации.

aepot
  • 49,560
  • Это все круто, но оно все равно будет заполнять сначала один текст бокс, потом второй и так далее. У меня в текстовом документе сначала записаны слова с индексом 1, потом 2, потом 3 и т.д. Слов очень много, порядка 6000 – Ярослав Овчар Nov 04 '20 at 11:34
  • @ЯрославОвчар вы попробовали? – aepot Nov 04 '20 at 11:44
  • Суть стоит ни во времени, ни в практичности. Задача стоит просто сделать так, чтоб они заполнялись одновременно. Но Ваш код я тоже попробую, спасибо. – Ярослав Овчар Nov 04 '20 at 13:26
  • @ЯрославОвчар в UI приложениях для работы с элементами управления у вас только один поток, технически невозможно делать с интерфейсом 100 дел одновременно. А чтобы получить визуально результат одновременной отрисовки, вы можете либо оптимизировать код, как я показал выше, либо останавливать отрисовку на время наполнения контролов данными плюс использовать буферизацию отрисовки. Параллельность здесь не играет большой роли, я и так в приведенном выше примере свел взаимодействие с интерфейсом к минимуму. С большой вероятностью вы получите именно то что хотите. Если нет, пишите, будем разбираться. – aepot Nov 04 '20 at 14:01
  • @ЯрославОвчар в любом случае, вы сначала попробуйте предложенное решение, а потом ставьте диагноз, но не наоборот. – aepot Nov 04 '20 at 14:05
  • Спасибо большое, в принципе, выглядит хорошо. Можете, пожалуйста, объяснить детальнее? Не так давно в программировании просто. – Ярослав Овчар Nov 04 '20 at 16:19
  • @ЯрославОвчар что именно объяснить? Чем лучше 6 обращений к текстбоксам вместо 6000? Наверное тем, что тексбоксу надо каждый раз перерисовываться как вы к нему обращаетесь. Дальше объяснять? Вы еще к тому, что сделали, добавьте решение по ссылке в ответе, там нужно просто вставить в код класса формы специальное свойство, должно стать еще бодрее. – aepot Nov 04 '20 at 16:46
  • Не подскажите ресурсы, где можно научиться писать более оптимизированный код, как и Вы? – Ярослав Овчар Nov 04 '20 at 16:53
  • @ЯрославОвчар чтобы писать четкий код, надо знать, как работает каждая его строчка. Без понимания как оно устроено будет сложно или даже невозможно научиться. Поэтому ищите, что такое контролы, как они работают, как отрисовываются, попробуйте создать с нуля свой контрол, экспериментируйте. Там не бездонное море, можно за неделю освоить. И так со всем, что непонятное встретите. Превращайте непонятное в понятное. Я вам несколько ответов давал, разберите каждую строчку кода, как она работает. Не заметите, как сами начнете так писать. Непонятен класс .NET - вбивайте в гугл и читайте как устроено. – aepot Nov 04 '20 at 17:01