Сравнение строк из массива (textbox1) с строками из MySQL C#
Нужно сравнить строки, которые записаны в textBox1 и строки из базы данных.
В массив string[] s; я записываю все строки из textBox1. Затем в цикле while пытаюсь сравнить их с теми, что приходят из базы, если строки совпадают, то нужно увеличить переменную minusWords на +1, если не совпадают, то увеличивается переменная plusWords на +1.
Так-же некорректно считаются минус и плюс слова, все в одну кучу лепит, возможно дело в самом цикле, честно, в данный момент ответить не смогу на этот вопрос.
Таким образом данный алгоритм должен убирать строки из textBox1, которые уже есть в базе данных и оставлять только те, которых нет. Долблюсь лбом об монитор битый час, прошу помощи, коллеги.
Вот мой код
//-------------запуск таймера------------------------------------------------------------------------------------//
Stopwatch sw_total = new Stopwatch();
sw_total.Start();
try
{
string connStr =
"server=localhost;" +
"user=root;" +
"database=test;" +
"password=;";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
string sql = "SELECT `numbers` FROM numbers";
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader reader = cmd.ExecuteReader();
// ---------------------- Считываем строки из textbox1 -----------------------------------
String[] s = textBox1.Text.Split(new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
String[] temp;
if (!reader.HasRows)
MessageBox.Show("Таблица пуста");
else
{
int nRows = 0;
int minusWords = 0;
int plusWords = 0;
while (reader.Read())
{
object number = reader["numbers"];
if (number.Equals(s[nRows]))
{
++minusWords;
}
else
++plusWords;
}
lblMinusWords.Text = $"Минус-слова: {minusWords}";
lblPlusWords.Text = $"Плюс-слова: {plusWords}";
MessageBox.Show("end");
}
}
catch (Exception ex)
{
}
//-------------вывод результата таймера----------------------------------------------------------------------//
sw_total.Stop();
lblTime.Text = ("Reading: " + sw_total.ElapsedMilliseconds + " ms");
Ответы (1 шт):
Вы сделали цикл по словам из базы, но не сделали цикл по своему массиву слов из текстбокса.
Вот так это должно выглядеть примерно:
var stringsFromDb = new string[] { "мама", "мыла", "раму" };
var stringsFromTxtBox = new string[] { "мама", "но", "раму", "же", "есть", "надо!" };
int minusWords = 0;
int plusWords = 0;
for (var i = 0; i < stringsFromTxtBox.Length; i++)
{
bool wordFound = false;
for (var j = 0; j < stringsFromDb.Length; j++)
{
if(string.Equals(stringsFromTxtBox[i], stringsFromDb[j], StringComparison.InvariantCultureIgnoreCase))
{
wordFound = true;
break;
}
}
if(wordFound)
{
plusWords++;
}
else
{
minusWords++;
}
}
Console.WriteLine(minusWords);
Console.WriteLine(plusWords);
Иначе вы сравниваете слово из базы с первым словом из текстбокса, либо (если наивно добавите инкремент для nRows) будете сравнивать i'тое слово из базы с i'тым словом из текстбокса, что разумеется даст неверный ответ.
Решение -- вложенный цикл, это самый медленный вариант, его сложность O(N^2) и вам нужно научиться такие решения делать, а потом когда начнёт получаться -- перейти к изучению более быстрых алгоритмов. Пример такого алгоритма вам дали в первом комментарии к вопросу.
PS Вы можете скачать сразу все строки из базы в переменную. Это очень удобно, если у вас алгоритм будет состоять из трёх шагов: А) ввод данных б) расчёт в) вывод. Вы сможете разбить код на отдельные методы, каждый из которых в соответствии с принципом единой ответственности будет делать что-то одно. Такой код читать и понимать будет гораздо проще. А также вы сможете потренироваться в написании циклов используя два массива строк - на том примере, который привёл я, а потом уже переходить к своему реальному примеру.