Lilyanaa Ответов: 2

Оптимизация для этого кода


Привет, как я могу оптимизировать свой код? Уменьшить количество строк (операторов)?

Что я уже пробовал:

private void button1_Click(object sender, EventArgs e)
      {
          string[] seq1 = { "A", "C", "G", "T", "A", "C", "A", "G","T","G" };
          string[] seq2 = { "T", "A", "C", "A", "C", "G","A","A","G","T" };
          string[] res1 = new string[seq1.Length];
          string[] res2 = new string[seq1.Length];
          for (int i = 0; i <= 4; i++)
          {

              res1[i] = seq1[i];
              res2[i] = seq2[i];
              textBox1.Text +=" "+ res1[i];
              textBox2.Text +=" "+ res2[i];
          }
          for(int i = 5; i < seq1.Length; i++)
          {
              if (seq1[i] == "T" )
              {
                  res1[i] = "A";

              }
              else
                  if (seq1[i] == "A" )
              {
                  res1[i] = "T";

              }
              else
                 if (seq1[i] == "C" )
              {
                  res1[i] = "G";

              }
              else
                 if (seq1[i] == "G" )
              {
                  res1[i] = "C";

              }
              textBox1.Text += res1[i]+"   ";

          }
          for (int i = 5; i < seq2.Length; i++)
          {
              if (seq2[i] == "T")
              {
                  res2[i] = "A";

              }
              else
                  if (seq2[i] == "A")
              {
                  res2[i] = "T";

              }
              else
                 if (seq2[i] == "C")
              {
                  res2[i] = "G";

              }
              else
                 if (seq2[i] == "G")
              {
                  res2[i] = "C";

              }

              textBox2.Text += res2[i] + "   ";
          }
      }

PIEBALDconsult

МММ... вы понимаете, что в .net строки неизменны, да?
Загляните в StringBuilder.

Richard MacCutchan

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

Lilyanaa

Как это можно сделать ?

Richard MacCutchan

Просто создайте массивы символов с целевыми символами в нужном месте. Затем вы можете использовать исходный символ в качестве индекса, что-то вроде:

// A translates to G, B to B, C to R etc
char[] destTable = { 'G', 'B', 'R' };

char source = // wherever this character comes from
char dest = destTable[source - 'A'];

2 Ответов

Рейтинг:
1

Jochen Arndt

Кажется, что ваш seq строки содержат только отдельные символы. Тогда используйте не строковые массивы, а символьные. Это не уменьшит количество строк, но уменьшит размер программы и увеличит скорость ее выполнения.

Замените также if else if условия по switch заявления.


Lilyanaa

Спасибо, да, это правильно, я буду использовать массив char

Lilyanaa

Как я могу использовать операторы switch с 2 массивами ?

Jochen Arndt

Вы должны использовать его для каждого массива. Когда обе последовательности имеют одинаковую длину, вы можете сделать это в одном цикле. Когда оба используют одну и ту же логику вы можете поместить оператор switch в подфункцию:

char getMatch(char seq)
{
 switch (seq)
 {
  case 'T' : return 'A';
  case 'A' : return 'T';
  // ...
 }
 // Error condition (e.g. throw an exception)
 return ' ';
}

Назовем это так:
res1[i] = getMatch(seq1[i]);
res2[i] = getMatch(seq2[i]);

Рейтинг:
1

johannesnestler

Так в чем же проблема?
Я вижу:
* использование прямого доступа к элементам управления и обновление свойств текста в цикле - неэффективно, не используется повторно.
* Нет названия для метода или обработчика щелчков, чтобы дать намек на то, что все это значит (я бы предположил, что некоторые расчеты ДНК?)
* Никаких комментариев или значимых имен переменных.
* жестко закодированные константы-почему 4 или 5?
* нет никаких причин для того, чтобы метод был нестатическим, кроме directaAccess ваших элементов управления.
* Неэффективные конкатинации строк-используйте StringBuilder..

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


Lilyanaa

Спасибо, это две последовательности ДНК, я пытаюсь заменить символ в последовательностях ДНК (: