В приведенном ниже примере программы демонстрируется применение операто ра let для создания еще одного перечислимого источника данных. В качестве входных данных в запрос вводится массив символьных строк, которые затем преобразуются в массивы типа char. Для этой цели служит еще один метод обработки строк, называе мый ToCharArray и возвращающий массив, содержащий символы в строке. Полу ченный результат присваивается переменной chrArray, которая затем используется во вложенном операторе from для извлечения отдельных символов из массива. И на конец, полученные символы сортируются в запросе, и из них формируется результи рующая последовательность. // Использовать оператор let в месте с вложенным оператором from. using System; using System.Linq; class LetDemo { static void Main { string[] strs = ( "alpha", "beta", "gamma" }; // Сформировать запрос на получение символов, возвращаемых из // строк в отсортированной последовательности. Обратите внимание // на применение вложенного оператора from. var chrs = from str in strs let chrArray = str.ToCharArray from ch in chrArray orderby ch select ch; Console.WriteLine("Отдельные символы, отсортированные по порядку:"); // Выполнить запрос и вывести его результаты. foreach(char с in chrs) Console.Write(с + " "); Console.WriteLine; } }

Вот к какому результату приводит выполнение этой программы. Отдельные символы, отсортированные по порядку: a a a a a b e g h l m m p t

Обратите внимание в данном примере программы на то, что в операторе let пе ременной chrArray присваивается ссылка на массив, возвращаемый методом str. ToCharArray. let chrArray = str.ToCharArray

После оператора let переменная chrArray может использоваться в остальных операторах, составляющих запрос. А поскольку все массивы в C# преобразуются в тип IEnumerable, то переменную chrArray можно использовать в качестве источника данных для запроса во втором, вложенном операторе from. Именно это и происходит в рассматриваемом здесь примере, где вложенный оператор from служит для пере числения в массиве отдельных символов, которые затем сортируются по нарастающей и возвращаются в виде конечного результата.

Оператор let может также использоваться для хранения неперечислимого значе ния. В качестве примера ниже приведен более эффективный вариант формирования запроса в программе IntoDemo из предыдущего раздела. var webAddrs = from addr in websites let idx = addr.LastIndexOf('.') where idx != -1 group addr by addr.Substring(idx) into ws where ws.Count > 2 select ws;

В этом варианте индекс последнего вхождения символа точки в строку присваи вается переменной idx. Данное значение затем используется в методе Substring. Благодаря этому исключается необходимость дважды искать символ точки в строке. Объединение двух последовательностей с помощью оператора join

Когда приходится иметь дело с базами данных, то зачастую требуется формиро вать последовательность, увязывающую данные из разных источников. Например, в Интернет-магазине может быть организована одна база данных, связывающая наи менование товара с его порядковым номером, и другая база данных, связывающая по рядковый номер товара с состоянием его запасов на складе. В подобной ситуации мо жет возникнуть потребность составить список, в котором состояние запасов товаров на складе отображается по их наименованию, а не порядковому номеру. Для этой цели придется каким-то образом "увязать" данные из двух разных источников (баз данных). И это нетрудно сделать с помощью такого средства LINQ, как оператор join.

Ниже приведена общая форма оператора join (совместно с оператором from). from переменная_диапазона_А in источник_данных_А join переменная_диапазона_В in источник_данных_В

on переменнаядиапазонаА. свойство equals переменнаядиапазонаВ. свойство Применяя оператор join, следует иметь в виду, что каждый источник должен со держать общие данные, которые можно сравнивать. Поэтому в приведенной выше форме этого оператора источникданныхА и источникданныхВ должны иметь нечто общее, что подлежит сравнению. Сравниваемые элементы данных указываются в части on данного оператора. Поэтому если переменнаядиапазонаА.свойство и переменнаядиапазонаА.свойство равны, то эти элементы данных "увязыва ются" успешно. По существу, оператор join выполняет роль своеобразного фильтра, отбирая только те элементы данных, которые имеют общее значение.

Перейти на страницу:

Похожие книги