// Использовать оператор 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();
}
}
Вот к какому результату приводит выполнение этой программы.
Отдельные символы, отсортированные по порядку: aaaaabeghlmmpt
Обратите внимание в данном примере программы на то, что в операторе let переменной chrArray присваивается ссылка на массив, возвращаемый методом str.
ToCharArray().
let chrArray = str.ToCharArray()
После оператора let переменная chrArray может использоваться в остальных операторах, составляющих запрос. А поскольку все массивы в C# преобразуются в тип IEnumerable<T>, то переменную chrArray можно использовать в качестве источника данных для запроса во втором, вложенном операторе from. Именно это и происходит в рассматриваемом здесь примере, где вложенный оператор from служит для перечисления в массиве отдельных символов, которые затем сортируются по нарастающей и возвращаются в виде конечного результата.
Оператор let может также использоваться для хранения неперечислимого значения. В качестве примера ниже приведен более эффективный вариант формирования запроса в программе IntoDemo из предыдущего раздела.
var webAddrs = from addr in websites
let idx = addr.LastlndexOf('.') 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
on
Применяя оператор join, следует иметь в виду, что каждый источник должен содержать общие данные, которые можно сравнивать. Поэтому в приведенной выше форме этого оператора
