Учебное пособие (1077022), страница 30
Текст из файла (страница 30)
В качестве параметра метод ArrayThreadTask получает объекткласса ParallelSearchThreadParam:/// <summary>/// Параметры которые передаются в поток/// для параллельного поиска/// </summary>class ParallelSearchThreadParam{/// <summary>/// Массив для поиска/// </summary>public List<string> tempList { get; set; }/// <summary>/// Слово для поиска/// </summary>public string wordPattern { get; set; }/// <summary>248/// Максимальное расстояние для нечеткого поиска/// </summary>public int maxDist { get; set; }/// <summary>/// Номер потока/// </summary>public int ThreadNum { get; set; }}Класс содержит входной массив слов и слово для поиска,максимальное расстояние для нечеткого поиска и номер потока.
Текстметода ArrayThreadTask:/// <summary>/// Выполняется в параллельном потоке для поиска строк/// </summary>public static List<ParallelSearchResult> ArrayThreadTask(objectparamObj){ParallelSearchThreadParam param =(ParallelSearchThreadParam)paramObj;//Слово для поиска в верхнем регистреstring wordUpper = param.wordPattern.Trim().ToUpper();//Результаты поиска в одном потокеList<ParallelSearchResult> Result = newList<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);}249}return Result;}В методе перебираются все слова в массиве для поиска, переданномданному потоку.
Если расстояние Дамерау-Левенштейна между текущимсловом и искомым словом меньше максимально допустимого, то текущееслово считается найденным и помещается в список результата.Список результата, являющийся возвращаемым значением метода,содержит объекты рассмотренного ранее класса ParallelSearchResult.Пример результатов нечеткого поиска представлен на рис. 45.Рис. 45. Результаты нечеткого поиска.12.4 Формирование отчетаПринажатиинакнопку«Сохранениеотчета»формирование отчета и сохранение в текстовый файл.проводятся250Рассмотрим код обработчика кнопки:private void buttonSaveReport_Click(object sender, EventArgs e){//Имя файла отчетаstring TempReportFileName = "Report_" +DateTime.Now.ToString("dd_MM_yyyy_hhmmss");//Диалог сохранения файла отчетаSaveFileDialog fd = new SaveFileDialog();fd.FileName = TempReportFileName;fd.DefaultExt = ".html";fd.Filter = "HTML Reports|*.html";if (fd.ShowDialog() == DialogResult.OK){string ReportFileName = fd.FileName;//Формирование отчетаStringBuilder b = new StringBuilder();b.AppendLine("<html>");b.AppendLine("<head>");b.AppendLine("<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'/>");b.AppendLine("<title>" + "Отчет: " + ReportFileName + "</title>");b.AppendLine("</head>");b.AppendLine("<body>");b.AppendLine("<h1>" + "Отчет: " + ReportFileName + "</h1>");b.AppendLine("<table border='1'>");b.AppendLine("<tr>");b.AppendLine("<td>Время чтения из файла</td>");b.AppendLine("<td>" + this.textBoxFileReadTime.Text + "</td>");b.AppendLine("</tr>");b.AppendLine("<tr>");b.AppendLine("<td>Количество уникальных слов в файле</td>");b.AppendLine("<td>" + this.textBoxFileReadCount.Text + "</td>");b.AppendLine("</tr>");b.AppendLine("<tr>");b.AppendLine("<td>Слово для поиска</td>");b.AppendLine("<td>" + this.textBoxFind.Text + "</td>");b.AppendLine("</tr>");b.AppendLine("<tr>");b.AppendLine("<td>Максимальное расстояние для нечеткого поиска</td>");b.AppendLine("<td>" + this.textBoxMaxDist.Text + "</td>");b.AppendLine("</tr>");b.AppendLine("<tr>");b.AppendLine("<td>Время четкого поиска</td>");b.AppendLine("<td>" + this.textBoxExactTime.Text + "</td>");b.AppendLine("</tr>");b.AppendLine("<tr>");b.AppendLine("<td>Время нечеткого поиска</td>");251b.AppendLine("<td>" + this.textBoxApproxTime.Text + "</td>");b.AppendLine("</tr>");b.AppendLine("<tr valign='top'>");b.AppendLine("<td>Результаты поиска</td>");b.AppendLine("<td>");b.AppendLine("<ul>");foreach (var x in this.listBoxResult.Items){b.AppendLine("<li>" + x.ToString() + "</li>");}b.AppendLine("</ul>");b.AppendLine("</td>");b.AppendLine("</tr>");b.AppendLine("</table>");b.AppendLine("</body>");b.AppendLine("</html>");//Сохранение файлаFile.AppendAllText(ReportFileName, b.ToString());MessageBox.Show("Отчет сформирован.
Файл: " + ReportFileName);}}В переменной TempReportFileName формируется имя файла на основетекущих даты и времени.Далее создается объект класса SaveFileDialog. При вызове методаShowDialog пользователю предлагается сохранить файл.Если пользователь не выбрал корректное имя файла для сохранения(условие «fd.ShowDialog() == DialogResult.OK» не выполняется), тообработчик события завершает работу.Если пользователь выбрал корректное имя файла, то формируетсяотчет в формате HTML с использованием класса StringBuilder.Отчет формируется в виде HTML-таблицы. После формированияотчета с помощью класса StringBuilder, отчет сохраняется в текстовыйфайл с помощью метода File.AppendAllText:File.AppendAllText(ReportFileName, b.ToString());Первым параметром метода является путь и имя файла, указанные вклассе SaveFileDialog. Вторым параметром метода является отчет,252сформированный с помощью класса StringBuilder и преобразуемый к типуString.Далее с применением класса MessageBox выводится сообщениепользователю об имени файла, содержащего отчет.
Отображение файлаотчета в браузере представлено на рис. 46.Рис. 46. Отображение файла отчета в браузере.Текст сформированного файла «Report_14_05_2015_140839.html»:<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/><title>Отчет: C:\root\Report_14_05_2015_140839.html</title></head><body><h1>Отчет: C:\root\Report_14_05_2015_140839.html</h1><table border='1'><tr><td>Время чтения из файла</td><td>00:00:00.0203904</td></tr><tr><td>Количество уникальных слов в файле</td><td>1454</td></tr><tr><td>Слово для поиска</td>253<td>язык</td></tr><tr><td>Максимальное расстояние для нечеткого поиска</td><td>2</td></tr><tr><td>Время четкого поиска</td><td>00:00:00.0004117</td></tr><tr><td>Время нечеткого поиска</td><td>00:00:00.0056350</td></tr><tr valign='top'><td>Результаты поиска</td><td><ul><li>языка:(расстояние=2 поток=0)</li><li>язык(расстояние=0 поток=0)</li><li>языков(расстояние=2 поток=0)</li><li>Язык(расстояние=0 поток=1)</li><li>языка(расстояние=1 поток=1)</li><li>языкам(расстояние=2 поток=2)</li><li>языки(расстояние=1 поток=2)</li><li>Языка(расстояние=1 поток=2)</li><li>языках(расстояние=2 поток=4)</li><li>языку:(расстояние=2 поток=5)</li><li>языке(расстояние=1 поток=5)</li><li>«Язык(расстояние=1 поток=7)</li><li>языком(расстояние=2 поток=7)</li><li>Языки(расстояние=1 поток=8)</li><li>CЯзыки(расстояние=2 поток=8)</li></ul></td></tr></table></body></html>12.5 Контрольные вопросы к разделу 121.
Как используется класс OpenFileDialog?2. Как применяется класс SaveFileDialog?3. Как используется класс MessageBox?4. Как используется элемент ListBox?2545. Как сформировать отчет с помощью класса StringBuilder исохранить его в виде текстового файла?255ЗаключениеВ учебном пособии были рассмотрены: краткая характеристика среды исполнения .NET; базовые конструкции языка программирования C#; основыобъектно-ориентированногопрограммированиясиспользованием C#; работа с коллекциями; основы использования файловой системы; рефлексия; основы параллельной обработки данных; основы технологии Windows Forms.Материал учебного пособия в целом соответствует содержаниюдисциплины«Базовыекомпонентыинтернет-технологий»,которуючитают преподаватели кафедры «Системы обработки информации иуправления» в третьем семестре.Полученные знания, умения и владения предполагается использоватьв рамках дисциплины «Разработка интернет-приложений», в рамкахкоторой рассматриваются такие технологии, как LINQ, Entity Framework,ASP.NET MVC.
Поэтому знание языка «C#» является необходимымтребованием для изучения данной дисциплины.256Источники1. Нейгел К., Ивьен Б., Глинн Д., Уотсон К. С# 5.0 и платформа .NET 4.5 дляпрофессионалов. : Пер. с англ. – М. : ООО «И.Д. Вильямс», 2014. – 1440 с.2. Шилдт Г. C# 4.0: полное руководство. : Пер. с англ. – М.















