Пример #1
0
        /// <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);
        }
Пример #2
0
        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("Необходимо выбрать файл и ввести слово для поиска");
            }

        }
Пример #3
0
        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("Необходимо выбрать файл и ввести слово для поиска");
            }
        }