Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
opi.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.81 Mб
Скачать

Мова linq.

Всі раніше розглянуті функціональні засоби знаходять хороше застосування в мові LINQ. LINQ – це SQL-подібний синтаксис запиту даних у класах. Припустимо, що у нас є колекція об'єктів Product і нам потрібно знайти три об'єкти з найвищими цінами і вивести їх назви та ціни. Не маючи LINQ , нам довелося б використовувати код, подібний до наведеного в лістингу 6.

Лістинг 6. Запит без застосування LINQ

using System ;

using System.Coolections.Generic;

class Program {

static void Main (string [] args) {

Product [] products = {

new Product {Name = "Kayak", Category = "Watersports", Price = 275M},

new Product {Name = "Lifejacket", Category = "Watersports", Price = 48.95M},

new Product {Name = "Soccer ball", Category = "Soccer", Price = 19.50M},

new Product {Name = "Corner flag", Category = "Soccer", Price = 34.95M}

};

// Визначення масиву для зберігання результатів

Product [] results = New Product [3];

// Сортування вмісту масиву

Array.Sort ( products , ( item1 , item 2) => {

return Comparer <decimal>. Default.Comppare(item1.Price, item2.Price);

});

// Отримання трьох перших елементів масиву у якості результатів

Array.Copy ( products , results , 3);

// Виведення назв

foreach (Product р in results) {

Console.WriteLine ("Item: {0}, Cost: {1} ", p.Name, p.Price);

}

}

}

LINQ дозволяє значно спростити процес запиту, як показано в лістингу 7.

Лістинг 7. Використання LINQ для запиту даних

using System ;

using System.Linq;

class Program {

static void Main (string [] args) {

Product [] products = {

new Product {Name = "Kayak", Category = "Watersports", Price = 275M},

new Product {Name = "Lifejacket", Category = "Watersports", Price = 48.95M},

new Product {Name = "Soccer ball", Category = "Soccer", Price = 19.50M},

new Product {Name = "Corner flag", Category = "Soccer", Price = 34.95M}

};

var results = from product in products

orderby product.Price descending

select new {

product.Name,

product.Price

};

// Виведення назв

int count = 0;

foreach (var р in results) {

Console.WriteLine ("Item: {0}, Cost: {1} ", p.Name, p.Price);

if (++count == 3) {

break ;

}

}

}

}

Цей код значно лаконічніший. SQL-подібний запит виділений напівжирним. Ми запитуємо об'єкти Product у порядку зниження ціни і використовуємо ключове слово select , щоб повернути анонімний тип, який містить лише ті властивості, які нам потрібні. Цей стиль LINQ відомий як синтаксис запиту, і з ним знайома більшість розробників. Недолік цього запиту в тому, що він повертає по одному анонімно типізованому об'єкту для кожного елемента Product масиву, який був використаний у вихідному запиті. Тому доводиться повозитися з результатами, щоб отримати перші три з них і вивести необхідні відомості.

Однак при готовності принести в жертву простоту синтаксису запиту, від LINQ можна домогтися значно більшого. Альтернативою є синтаксис точкового запису, або просто точковий запис, побудований на основі методів розширення. Використання цього альтернативного синтаксису для обробки об'єктів Product продемонстровано в лістингу 8.

Лістинг 8. Використання точкової запису LINQ

using System ;

using System.Linq;

class Program {

static void Main (string [] args) {

Product [] products = {

new Product {Name = "Kayak", Category = "Watersports", Price = 275M},

new Product {Name = "Lifejacket", Category = "Watersports", Price = 48.95M},

new Product {Name = "Soccer ball", Category = "Soccer", Price = 19.50M},

new Product {Name = "Corner flag", Category = "Soccer", Price = 34.95M}

};

var results = products

.OrderByDescending (e => e.Price)

.Take (3)

.Select (e => new { e.Name, e.Price });

foreach (var р in results) {

Console.WriteLine ("Item: {0}, Cost: {1} ", p.Name, p.Price);

}

}

}

Перш за все, слід визнати, що цей запит LINQ , виділений напівжирним, виглядає не таким чітким, як виражений у відповідності з синтаксисом запитів, але не всі функціональні засоби LINQ мають відповідні ключові слова С#. Для вирішення серйозних завдань програмування LINQ доведеться перейти до використання методів розширення. Кожен з методів розширення LINQ, представлений в лістингу 8, застосовується до IEnumerable < T > і повертає IEnumerable < T >, що дозволяє об'єднувати методи в ланцюжки для створення складних запитів.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]