Литмир - Электронная Библиотека
A
A

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>  // Загрузить электронную книгу Чарльза Диккенса &quot;A Tale of Two Cities&quot;.</b>

<b>  // Может понадобиться двукратное выполнение этого кода, если ранее вы</b>

<b>  // не посещали данный сайт, поскольку при первом его посещении появляется</b>

<b>  // окно с сообщением, предотвращающее нормальное выполнение кода.</b>

  wc.DownloadStringAsync(new Uri(&quot;http://www.gutenberg.org/

  files/98/98-8.txt&quot;));

}

Класс

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(&quot;Ten Most Common Words are:\n&quot;);

  foreach (string s in tenMostCommon)

  {

    bookStats.AppendLine(s);

  }

  bookStats.AppendFormat(&quot;Longest word is: {0}&quot;, longestWord);

                       // Самое длинное слово

  bookStats.AppendLine();

  Console.WriteLine(bookStats.ToString(), &quot;Book info&quot;);

                                        // Информация о книге

}

Метод

FindTenMostCommon()
использует запрос LINQ для получения списка объектов
string
, которые наиболее часто встречаются в массиве
string
, а метод
FindLongestWord()
находит самое длинное слово:

string[] FindTenMostCommon(string[] words)

{

    var frequencyOrder = from word in words

                         where word.Length &gt; 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

293
{"b":"847442","o":1}