using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Net;
using System.Text;
string _theEBook = "";
GetBook();
Console.WriteLine("Downloading book...");
Console.ReadLine();
void GetBook()
{
WebClient wc = new WebClient();
wc.DownloadStringCompleted += (s, eArgs) =>
{
_theEBook = eArgs.Result;
Console.WriteLine("Download complete.");
GetStats();
};
<b> // Загрузить электронную книгу Чарльза Диккенса "A Tale of Two Cities".</b>
<b> // Может понадобиться двукратное выполнение этого кода, если ранее вы</b>
<b> // не посещали данный сайт, поскольку при первом его посещении появляется</b>
<b> // окно с сообщением, предотвращающее нормальное выполнение кода.</b>
wc.DownloadStringAsync(new Uri("http://www.gutenberg.org/
files/98/98-8.txt"));
}
Класс
WebClient
определен в пространстве имен
System.Net
. Он предоставляет несколько методов для отправки и получения данных от ресурса, идентифицируемого посредством URL. В свою очередь многие из них имеют асинхронные версии, такие как метод
DownloadStringAsync()
, который автоматически порождает новый поток из пула потоков .NET Core Runtime. Когда объект
WebClient
завершает получение данных, он инициирует событие
DownloadStringCompleted
, которое обрабатывается с применением лямбда-выражения С#. Если вызвать синхронную версию этого метода (
DownloadString()
), то сообщение
Downloading book...
не появится до тех пор, пока загрузка не завершится.
Далее реализуйте метод
GetStats()
для извлечения индивидуальных слов, содержащихся в переменной
theEBook
, и передачи строкового массива на обработку нескольким вспомогательным методам:
void GetStats()
{
<b> // Получить слова из электронной книги.</b>
string[] words = _theEBook.Split(new char[]
{ ' ', '\u000A', ',', '.', ';', ':', '-', '?', '/' },
StringSplitOptions.RemoveEmptyEntries);
<b> // Найти 10 наиболее часто встречающихся слов.</b>
string[] tenMostCommon = FindTenMostCommon(words);
<b> // Получить самое длинное слово.</b>
string longestWord = FindLongestWord(words);
<b> // Когда все задачи завершены, построить строку, показывающую</b>
<b> // все статистические данные в окне сообщений.</b>
StringBuilder bookStats =
new StringBuilder("Ten Most Common Words are:\n");
foreach (string s in tenMostCommon)
{
bookStats.AppendLine(s);
}
bookStats.AppendFormat("Longest word is: {0}", longestWord);
// Самое длинное слово
bookStats.AppendLine();
Console.WriteLine(bookStats.ToString(), "Book info");
// Информация о книге
}
Метод
FindTenMostCommon()
использует запрос LINQ для получения списка объектов
string
, которые наиболее часто встречаются в массиве
string
, а метод
FindLongestWord()
находит самое длинное слово:
string[] FindTenMostCommon(string[] words)
{
var frequencyOrder = from word in words
where word.Length > 6
group word by word into g
orderby g.Count() descending
select g.Key;
string[] commonWords = (frequencyOrder.Take(10)).ToArray();
return commonWords;
}
string FindLongestWord(string[] words)
{
return (from w in words orderby w.Length descending select w)
.FirstOrDefault();
}
После запуска проекта выполнение всех задач может занять внушительный промежуток времени, что зависит от количества процессоров в машине и их тактовой частоты. В конце концов, должен появиться следующий вывод:
Downloading book...
Download complete.
Ten Most Common Words are:
Defarge
himself
Manette