Sigmond Gatt Ответов: 2

Оптимизация цикла for В C#


Всем привет,

У меня есть цикл for, который я хочу оптимизировать, кто-то может помочь мне или дать мне некоторые трюки для оптимизации

string sql1 = "select * from (select distinct left(start_bin_value,6) from sys_mast_inter_bin_table mast join cht_card_brand cb on mast.card_brand = cb.index_field join cht_country ctry on mast.bin_country = ctry.index_field join cht_service_type st on mast.service_type = st.index_field where cb.card_brand = '" + this.Card_brand + "' and ctry.client_country = '" + this.Bin_country + "' and st.service_type = '" + this.Service_type + "' ) where rownum <= " + this.TestCases + " order by dbms_random.value";

                       OleDbCommand command1 = new OleDbCommand(sql1, this.Connection);
                       OleDbDataReader reader1 = command1.ExecuteReader();
                       LuhnCheck lc = new LuhnCheck();

                       while (reader1.Read())
                       {
                           string result = lc.generate(reader1[0].ToString(), Convert.ToInt32(txtChangeLength.Text));
                           txtRandCardNumbers.Text += result + Environment.NewLine;
                       }
                       int rows = this.TestCases;
                       string[] textCardNumber = new string[rows];
                       StringReader readingCardNumber = new System.IO.StringReader(txtRandCardNumbers.Text);
                       int numberofrows = txtRandCardNumbers.Lines.Count() - 1;
                       if (reader1.Read() == false && numberofrows < this.TestCases)
                       {
                           int f = 0;
                           int loop = this.TestCases - txtRandCardNumbers.Lines.Count();

                           for (int cx = 0; cx <= loop; cx++)
                           {
                               textCardNumber[cx] = readingCardNumber.ReadLine();
                               if (textCardNumber[cx] is null)
                               {
                                   textCardNumber[cx] = textCardNumber[f + 0];
                                   f++;
                               }
                               txtRandCardNumbers.Text += textCardNumber[cx] + Environment.NewLine;

                           }
                       }
                       reader1.Close();
                   }


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

Я попытался порыться в интернете и узнал о параллельном массиве, но не знаю, как это сделать.

2 Ответов

Рейтинг:
18

Graeme_Grant

txtRandCardNumbers.Text += textCardNumber[cx] + Environment.NewLine;

Я бы использовал класс StringBuilder[^]
var sb = new StringBuilder;

for (int cx = 0; cx <= loop; cx++)
{
    ...
    sb.AppendLine(textCardNumber[cx]);
    ...
}

txtRandCardNumbers.Text = sb.ToString();


Sigmond Gatt

спасибо, Грэм, есть еще что-то, что я могу изменить ? мне просто нужно научиться оптимизации

Рейтинг:
0

Patrice T

string sql1 = "select * from (select distinct left(start_bin_value,6) from sys_mast_inter_bin_table mast join cht_card_brand cb on mast.card_brand = cb.index_field join cht_country ctry on mast.bin_country = ctry.index_field join cht_service_type st on mast.service_type = st.index_field where cb.card_brand = '" + this.Card_brand + "' and ctry.client_country = '" + this.Bin_country + "' and st.service_type = '" + this.Service_type + "' ) where rownum <= " + this.TestCases + " order by dbms_random.value";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL Injection-руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL-OWASP[^]


Sigmond Gatt

и что я могу сделать, вместо того, чтобы например, этот.card_brand?

PS: Это все поля со списком, а 2 текстовых поля, которые у меня есть, принимают только цифры.