Главная » C# » Знакомство с LINQ в Visual C# (Sharp)

0

В предыдущей главе мы узнали, как обращаться к базе данных посредством традионных технологий ADO.NET. При запросе ADO.NET вызываются процедуры яза SQL, а возвращенный набор результатов упорядочивается также с помощью SQL.

Язык LINQ (Language Integrated Query, язык интегрированных запросов) позволяет организовывать результаты запроса в единообразном формате, независимо от иочника данных. Спрашивается, зачем нужна еще одна технология запросов? Ответ на этот вопрос имеет отношение к языку XML.

Язык XML предназначен для представления  информации в иерархическом  поряе. Пример использования XML был рассмотрен в главе  12.  С  помощью  языка XML многие проблемы решаются элегантным и легко понимаемым  образом. Оим из решений, предлагаемых XML, является возможность обращаться к инфоации в формате XML с помощью языка XPath, который, в свою очередь, позволт обращаться к структуре объекта, используя набор фильтров. С помощью языка XPath можно найти любой элемент, а фильтры могут включать зависимые элемеы, что не очень легко осуществить в других технологиях.  Простыми  словами, XPath и XML являются очень мощными технологиями для поиска информации.

Эти два языка можно  рассматривать  как  вдохновившие  создание  языка  LINQ. Но LINQ отличается от XML и XPath тем, что с помощью LINQ можно обращаться к объектам С#, документам XML и реляционным базам данных, т. е. LINQ можно рассматривать как общий механизм для выполнения поиска в иерархии информации. В этой главе основное внимание уделяется объяснению механики языка LINQ и донстрации запросов и использования методов, связанных с библиотекой LINQ.

Определение частоты выпадения выигрышных номеров

Приложение предсказания лотерейных номеров, с которым мы работали в предущих главах, сохраняет выигрышные номера лотереи для каждого розыгрыша, чтобы на их основе попытаться предсказать выигрышные номера следующего розрыша. Идея приложения заключается в обнаружении закономерностей. Опять же,

действительность такова, что номера в каждом розыгрыше выпадают на проиольной  основе,  поэтому,  даже  если  вы  и  сможете  обнаружить  закономерности в номерах предыдущих розыгрышей, это не означает, что вы сможете предсказать номера следующего розыгрыша. Но интерес в этой проблеме представляет то, что мы можем использовать язык LINQ для манипулирования данными. Язык LINQ позволяет сохранять данные в виде объектов и выполнять SQL- и XPath-подобные операции, как будет показано в этой главе. В главе 10 была рассмотрена архитекта потоков, где консольное приложение считывало и выводило текстовые данные. Там  же  были  показаны  примеры  преобразований  текстовых данных  в  двоичные и наоборот. Приложение, с которым мы будем работать в этой главе (проект FrequencyProcessor), считывает текстовые данные, обрабатывает их и генерирует текстовый результат. Таким образом, нам нужен интерфейс "текст — текст", котый был определен в главе 10 так:

public interface IProcessor { string Process(string input);

}

Входными данными является следующий текстовый поток:

2006.03.11 3 7 15 28 30 38 44 2006.03.15 10 18 30 34 41 43 5

2006.03.18 3 11 12 16 20 40 9

2006.03.22 2 3 7 13 42 43 41

2006.03.25 3 10 36 40 43 44 35

2006.03.29 3 4 8 16 34 39 45

Если мы хотим найти частоту выпадения отдельных номеров,  то данные можно проанализировать по отдельным  номерам, увеличивая значение счетчика для каого нового случая каждого номера. Эту операцию можно выполнить с помощью следующего кода:

string[] splitUpText = lineOfText.Split(new char[] {”}); frequency[int.Parse(splitUpText[0])] ++;

frequency[int . Pairse (splitUpText [ 1 ] ) ] ++;

Строка текста разбивается на отдельные фрагменты, содержащие число в текстой форме,  которое потом преобразуется в собственно число и используется в кестве индекса для подсчета частоты вхождений данного числа. Это решение рабает и довольно быстро, но имеет одну большую проблему:  оно  не  расширяемо. Его можно применить для решения одной и только одной проблемы.

Скажем, нам нужно вычислить другую статистическую информацию: какие числые комбинации встречаются наиболее часто. Применение предыдущего решения требовало бы повторного преобразования текстового потока, что является трудмким и дорогостоящим решением. Лучшим подходом было бы преобразовать тетовый поток в последовательность объектов, которые можно обрабатывать.

Но наша насущная проблема заключается только в подсчете частоты вхождения отдельных номеров. Зачем же тогда прикладывать лишние усилия в поисках решия, подходящего для других проблем, если данное решение полностью решает текущую проблему? Затем, что создание качественного кода означает применение общего, но специфического подхода к решению проблем. Код должен быть специческим, чтобы  мы не увязли  в обдумывании подробностей в будущем;  в то же самое время код должен быть достаточно общим, чтобы дополнительные требовия в будущем не вынудили нас полностью переписывать приложение.  Спосоость предвидеть, когда писать специфический код, а когда общий, в сущности, является делом опыта, и единственный способ приобрести его — работать,  рабать и снова работать по написанию кода.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии