Полное руководство. С# 4.0 - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Эта программа дает следующий результат.Положительные значения меньше 10: 1 3 6 9
Как видите, по данному запросу извлекаются только положительные значенияменьше. 10. Этот результат достигается благодаря двум следующим операторамwhere.where n > 0where n < 10
Условие в первом операторе where требует, чтобы элемент массива был большенуля. А условие во втором операторе where требует, чтобы элемент массива был меньше 10. Следовательно, запрашиваемый элемент массива должен находиться в пределахот 1 до 9 (включительно), чтобы удовлетворять обоим условиям.
В таком применении двух операторов where для отбора данных нет ничего дурного, но аналогичного эффекта можно добиться с помощью более компактно составленного условия в единственном операторе where. Ниже приведен тот же самый запрос,переформированный по этому принципу.var posNums = from n in nums where n > 0 ts n < 10 select n;
Как правило, в условии оператора where разрешается использовать любое допустимое в C# выражение, дающее булев результат. Например, в приведенной ниже программе определяется массив символьных строк. В ряде этих строк содержатся адресаИнтернета. По запросу в переменой netAddrs извлекаются только те строки, которыесодержат более четырех символов и оканчиваются на ".net". Следовательно, по данному запросу обнаруживаются строки, содержащие адреса Интернета с именем .netдомена самого верхнего уровня.// Продемонстрировать применение еще одного оператора where.using System;using System.Linq;class WhereDemo2 { static void Main() { string[] strs = { ".com", ".net", "hsNameA.com", "hsNameB.net", "test", ".network", "hsNameC.net", "hsNameD.com" }; // Сформировать запрос на получение адресов // Интернета, оканчивающихся на .net. var netAddrs = from addr in strs where addr.Length > 4 && addr.EndsWithC.net", StringComparison.Ordinal) select addr; // Выполнить запрос и вывести его результаты. foreach(var str in netAddrs) Console.WriteLine(str); }}
Вот к какому результату приводит выполнение этой программы.hsNameB.nethsNameC.net
Обратите внимание на то, что в операторе where данной программы используетсяодин из методов обработки символьных строк под названием EndsWith(). Он возвращает логическое значение true, если вызывающая его строка оканчивается последовательностью символов, указываемой в качестве аргумента этого метода.Сортировка результатов запроса с помощью оператора orderby
Зачастую результаты запроса требуют сортировки. Допустим, что требуется получить список просроченных счетов по порядку остатка на счету: от самого большого досамого малого или же список имен заказчиков в алфавитном порядке. Независимо отпреследуемой цели, результаты запроса можно очень легко отсортировать, используятакое средство LINQ, как оператор orderby.
Оператор orderby можно использовать для сортировки результатов запроса поодному или нескольким критериям. Рассмотрим для начала самый простой случайсортировки по одному элементу. Ниже приведена общая форма оператора orderbyдля сортировки результатов запроса по одному критерию:orderby элемент порядок
где элемент обозначает конкретный элемент, по которому проводится сортировка.Это может быть весь элемент, хранящийся в источнике данных, или только часть одного поля в данном элементе. А порядок обозначает порядок сортировки по нарастающей или убывающей с обязательным добавлением ключевого слова ascending илиdescending соответственно. По умолчанию сортировка проводится по нарастающей,и поэтому ключевое слово ascending, как правило, не указывается.
Ниже приведен пример программы, в которой оператор orderby используетсядля извлечения значений из массива типа int по нарастающей.// Продемонстрировать применение оператора orderby.using System;using System.Linq;class OrderbyDemo { static void Main() { int[] nums = { 10, -19, 4, 7, 2, -5, 0 }; // Сформировать запрос на получение значений в отсортированном порядке. var posNums = from n in nums orderby n select n; Console.Write("Значения по нарастающей: "); // Выполнить запрос и вывести его результаты. foreach(int i in posNums) Console.Write(i + " "); Console.WriteLine(); }}
При выполнении этой программы получается следующий результат.Значения по нарастающей: -19 -5 0 2 4 7 10
Для того чтобы изменить порядок сортировки по нарастающей на сортировку поубывающей, достаточно указать ключевое слово descending, как показано ниже.var posNums = from n in nums orderby n descending select n;
Попробовав выполнить этот запрос, вы получите значения в обратном порядке.Зачастую сортировка результатов запроса проводится по единственному критерию.Тем не менее для сортировки по нескольким критериям служит приведенная нижеформа оператора orderby.orderby элемент_А направление, элемент_В направление, элемент_С направление, ...
В данной форме элементА обозначает конкретный элемент, по которому проводится основная сортировка; элементВ — элемент, по которому производится сортировка каждой группы эквивалентных элементов; элемент_С — элемент, по которомупроизводится сортировка всех этих групп, и т.д. Таким образом, каждый последующийэлемент обозначает дополнительный критерий сортировки. Во всех этих критерияхуказывать направление сортировки необязательно, но по умолчанию сортировка проводится по нарастающей. Ниже приведен пример программы, в которой сортировкаинформации о банковских счетах осуществляется по трем критериям: фамилии, имени и остатку на счете.// Сортировать результаты запроса по нескольким// критериям, используя оператор orderby.using System;using System.Linq;class Account { public string FirstName { get; private set; } public string LastName { get; private set; } public double Balance { get; private set; } public string AccountNumber { get; private set; } public Account(string fn, string ln, string accnum, double b) { FirstName = fn; LastName = ln; AccountNumber = accnum; Balance = b; }}class OrderbyDemo { static void Main() { // Сформировать исходные данные. Account[] accounts = { new Account("Том", "Смит", "132CK", 100.23), new Account("Том", "Смит", "132CD", 10000.00), new Account("Ральф", "Джонс", "436CD", 1923.85), new Account("Ральф", "Джонс", "454MM", 987.132), new Account("Тед", "Краммер", "897CD", 3223.19), new Account("Ральф", "Джонс", "434CK", -123.32), new Account("Capa", "Смит", "543MM", 5017.40), new Account("Capa", "Смит", "547CD", 34955.79), new Account("Capa", "Смит", "843CK", 345.00), new Account("Альберт", "Смит", "445CK", -213.67), new Account("Бетти", "Краммер","968MM",5146.67), new Account("Карл", "Смит", "078CD", 15345.99), new Account("Дженни", "Джонс", "108CK", 10.98) }; // Сформировать запрос на получение сведений о // банковских счетах в отсортированном порядке. // Отсортировать эти сведения сначала по имени, затем // по фамилии и, наконец, по остатку на счете, var accInfo = from асе in accounts orderby acc.LastName, acc.FirstName, acc.Balance select acc; Console.WriteLine("Счета в отсортированном порядке: "); string str = ""; // Выполнить запрос и вывести его результаты. foreach(Account acc in accInfo) { if(str != acc.FirstName) { Console.WriteLine(); str = acc.FirstName; } Console.WriteLine("{0}, {1}tHoмep счета: {2}, {3,10:C}", acc.LastName, acc.FirstName, acc. AccountNumber, acc.Balance); } Console.WriteLine(); }}
Ниже приведен результат выполнения этой программы.Счета в отсортированном порядке:Джонс, Дженни Номер счета: 108СК, $10.98Джонс, Ральф Номер счета: 434СК, ($123.32)Джонс, Ральф Номер счета: 454ММ, $987.13Джонс, Ральф Номер счета: 436CD, $1,923.85Краммер, Бетти Номер счета: 968ММ, $5,146.67Краммер, Тед Номер счета: 897CD, $3,223.19Смит, Альберт Номер счета: 445СК, ($213.67)Смит, Карл Номер счета: 078CD, $15,345.99Смит, Сара Номер счета: 843СК, $345.00Смит, Сара Номер счета: 543ММ, $5,017.40Смит, Сара Номер счета: 547CD, $34,955.79Смит, Том Номер счета: 132СК, $100.23Смит, Том Номер счета: 132CD, $10,000.00