// Сформировать запрос на получение значений в отсортированном порядке, var posNums = from n in nums orderby n select n;
Console.Write("Значения по нарастающей: ");
// Выполнить запрос и вывести его результаты. foreach(int i in posNums) Console.Write(i + " ");
При выполнении этой программы получается следующий результат.
Значения по нарастающей: -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 In, string accnum, double b) {
FirstName = fn;
LastName = In;
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 acclnfo = from асс in accounts
orderby acc.LastName, acc.FirstName, acc.Balance select acc;
Console.WriteLine("Счета в отсортированном порядке: ") ; string str = "";
// Выполнить запрос и вывести его результаты, foreach(Account acc in acclnfo) { if(str != acc.FirstName) {
Console.WriteLine(); str = acc.FirstName;
}
Console.WriteLine("{0}, {l}\tHoMep счета: {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