/// <summary> /// Выполняется в параллельном потоке для поиска строк /// </summary> /// <param name="param"></param> public static List <ParallelSearchResult> ArrayThreadTask(object paramObj) { ParallelSearchThreadParam param = (ParallelSearchThreadParam)paramObj; //Слово для поиска в верхнем регистре string wordUpper = param.wordPattern.Trim().ToUpper(); //Результаты поиска в одном потоке List <ParallelSearchResult> Result = new List <ParallelSearchResult>(); //Перебор всех слов во временном списке данного потока foreach (string str in param.tempList) { //Вычисление расстояния Дамерау-Левенштейна int dist = EditDistance.Distance(str.ToUpper(), wordUpper); //Если расстояние меньше порогового, то слово добавляется в результат if (dist <= param.maxDist) { ParallelSearchResult temp = new ParallelSearchResult() { word = str, dist = dist, ThreadNum = param.ThreadNum }; Result.Add(temp); } } return(Result); }
private void buttonApprox_Click(object sender, EventArgs e) { //Слово для поиска string word = this.textBoxFind.Text.Trim(); EditDistance L = new EditDistance(); string wordUpper = word.ToUpper(); //Если слово для поиска не пусто if (!string.IsNullOrWhiteSpace(word) && list.Count > 0) { int maxDist; if(!int.TryParse(this.textBoxMaxDist.Text.Trim(), out maxDist)) { MessageBox.Show("Необходимо указать максимальное расстояние"); return; } if (maxDist < 1 || maxDist > 5) { MessageBox.Show("Максимальное расстояние должно быть в диапазоне от 1 до 5"); return; } Stopwatch timer = new Stopwatch(); timer.Start(); int distant, maxDistant; if (int.TryParse(textBoxMaxDist.Text, out maxDistant)) { listBoxResult.BeginUpdate(); listBoxResult.Items.Clear(); foreach (string str in list) { distant = L.Distance(str.ToUpper(), wordUpper); if (distant <= maxDistant) { listBoxResult.Items.Add(str + " (расстояние = " + distant.ToString() + ")"); } } if (listBoxResult.Items.Count == 0) listBoxResult.Items.Add("Слова не найдены! Введите расстояние Левенштейна бОльшее!"); listBoxResult.EndUpdate(); } else { textBoxMaxDist.Text = "Целое Число.."; listBoxResult.Items.Clear(); } timer.Stop(); //Окончание обновления списка результатов this.listBoxResult.EndUpdate(); } else { MessageBox.Show("Необходимо выбрать файл и ввести слово для поиска"); } }
private void buttonApprox_Click(object sender, EventArgs e) { //Слово для поиска string word = this.textBoxFind.Text.Trim(); //Если слово для поиска не пусто if (!string.IsNullOrWhiteSpace(word) && list.Count > 0) { int maxDist; if (!int.TryParse(this.textBoxMaxDist.Text.Trim(), out maxDist)) { MessageBox.Show("Необходимо указать максимальное расстояние"); return; } if (maxDist < 1 || maxDist > 5) { MessageBox.Show("Максимальное расстояние должно быть в диапазоне от 1 до 5"); return; } //Слово для поиска в верхнем регистре string wordUpper = word.ToUpper(); //Временные результаты поиска List <Tuple <string, int> > tempList = new List <Tuple <string, int> >(); Stopwatch t = new Stopwatch(); t.Start(); foreach (string str in list) { //Вычисление расстояния Дамерау-Левенштейна int dist = EditDistance.Distance(str.ToUpper(), wordUpper); //Если расстояние меньше порогового, то слово добавляется в результат if (dist <= maxDist) { tempList.Add(new Tuple <string, int>(str, dist)); } } t.Stop(); this.textBoxApproxTime.Text = t.Elapsed.ToString(); this.listBoxResult.BeginUpdate(); //Очистка списка this.listBoxResult.Items.Clear(); //Вывод результатов поиска foreach (var x in tempList) { string temp = x.Item1 + "(расстояние=" + x.Item2.ToString() + ")"; this.listBoxResult.Items.Add(temp); } this.listBoxResult.EndUpdate(); } else { MessageBox.Show("Необходимо выбрать файл и ввести слово для поиска"); } }