private void btnHamming_Click(object sender, EventArgs e) { clearAll(); if ((rtbData.Text == "") || (txtInput.Text == "") || (insertDistance.Text == "")) { this.errorProviderH.SetError(btnHamming, "Одно из полей пустое"); } else { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); List <string> allCloseWords = new List <string>(); string checker = txtInput.Text.ToString(); string editLines = rtbData.Text.ToString(); int maxDist = Convert.ToInt32(insertDistance.Text.ToString()); string checkFromRTF = ""; int minDist = Int32.MaxValue; string closestWord = ""; int i = 0; int length = editLines.Length; while (i < length) { checkFromRTF = ""; while ((i < length) && (!checkIfNeededChar(editLines[i]))) { i++; } while ((i < length) && (checkIfNeededChar(editLines[i]))) { checkFromRTF += editLines[i]; i++; } int checkDist = Metricas.GetHammingDistance(checker, checkFromRTF); if (checkDist != -1) { int checkDist1 = Metricas.GetHammingDistance(checker, checkFromRTF.ToLower()); if (checkDist1 == minDist) { allCloseWords.Add(checkFromRTF); } else if (checkDist1 < minDist) { allCloseWords.Clear(); allCloseWords.Add(checkFromRTF); minDist = checkDist1; closestWord = checkFromRTF; } if (checkDist <= maxDist) { int index; if (checkDotOrComma(editLines[i - 1])) { index = i - checkFromRTF.Length - 1; } else { index = i - checkFromRTF.Length; } rtbData.Select(index, checkFromRTF.Length); rtbData.SelectionColor = Color.Red; } } } if (closestWord == "") { lblMaybeYouSearched.Text = "Возможно вы искали: нет подходящих результатов"; } else { lblMaybeYouSearched.Text = "Возможно вы искали: " + closestWord + "?"; } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds); txtElapsedTime.Text = elapsedTime; int cnt = 0; foreach (string str in allCloseWords) { if (str == closestWord) { cnt++; } } if (allCloseWords.Count == 0) { txtPercent.Text = Convert.ToString(0); } else { txtPercent.Text = Convert.ToString((Convert.ToDouble(cnt) / Convert.ToDouble(allCloseWords.Count)) * 100.0); } } }