Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_ПАРАДИГМИ ПРОГРАМУВАННЯ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.32 Mб
Скачать

12.2. Linq: узагальнення і інтерфейси

Запити LINQ базуються на узагальненнях (generic), які вперше були представлені в .NET Framework версії 2.0.

Узагальнення (generic, універсальні типи) були додані в мову C# версії 2.0 і середовище CLR. Узагальнення в платформі .NET Framework представляють концепцію параметрів типів, які дозволяють розробляти класи і методи, що не дотримуються специфікації одного або декількох типів до тих пір, поки клас або метод не буде оголошений клієнтським кодом і доки не буде створений його екземпляр.

Призначення узагальнень - досягнення максимального рівня повторного використання коду, безпеки типу і продуктивності.

З узагальненням пов'язано поняття інтерфейсу, зокрема стандартного інтерфейсу IEnumerable<(Of <(T>)>)

Для написання запитів не потрібне глибоке знання узагальнень і інтерфейсів. Але розуміння двох основних понять може згодитися.

  • При створенні екземпляра класу універсальної колекції, наприклад List<(Of <(<T>)>), "T" замінюється типом об'єктів, які зберігатимуться в списку. Наприклад, список рядків виражається як List<string>, а список об'єктів Customer виражається як List<Customer>. Універсальний список є таким, що строго типізується і надає безліч переваг над колекціями, які зберігають свої елементи як Object. При спробі додати Customer до List<string> виникне помилка під час компіляції. Використання універсальних колекцій не викликає складнощів, оскільки не потрібно виконувати приведення типів під час виконання.

  • IEnumerable<(Of <(T>)>) є інтерфейсом, який дозволяє класам універсальних колекцій підтримувати перелічення за допомогою оператора foreach. Класи універсальних колекцій підтримують IEnumerable<(Of <(T>)>) так само, як не універсальні класи колекцій, наприклад ArrayList, підтримують IEnumerable.

12.2.1. Змінні iEnumerable в запитах linq

Змінні запитів LINQ визначені як IEnumerable<(Of <(T>)>) або як похідний тип, наприклад IQueryable<(Of <(T>)>). Якщо змінна запиту має тип IEnumerable<Customer>, це означає, що запит при виконанні виведе послідовність з нуля або більше об'єктів Customer:

IEnumerable<Customer> customerQuery =

from cust in customers

where cust.City == "Москва"

select cust;

За бажанням звичайного синтаксису універсальних шаблонів можна уникнути за допомогою ключового слова var. Ключове слово var повідомляє компілятор про необхідність визначення типу змінної запиту за допомогою перегляду джерела даних, вказаного в слові from. У наступному прикладі створюється той самий скомпільований код, що і в попередньому прикладі:

var customerQuery2 =

from cust in customers

where cust.City == "Москва"

select cust;

foreach(var customer in customerQuery2)

{

Console.WriteLine(customer.LastName + ", " + customer.FirstName);

}

Ключове слово var зручно, коли тип змінної є очевидним, або коли не потрібно явно вказувати вкладених універсальних типів, що наприклад, створюються запитами group. В цілому, якщо використовується var, важливо усвідомлювати, що код може бути складнішим для читання.

Приклад.

Визначимо як джерело даних клас:

class Customer

{

public string First { get; set; }

public string Last { get; set; }

public int ID { get; set; }

public string City { get; set; }

public string Zakaz;

}

Вибираємо замовників з Києва

//customers

List<Customer> customers = new List<Customer>()

{

new Customer {First="Александр"

Last="Андрусенко"

ID=100

City="Киев"

Zakaz = "цукерки"},

new Customer {First="Иван"

Last="Гринев"

ID=101

City="Киев"

Zakaz = "цукерки"}

};

var customerQuery2 =

from cust in customers

where cust.City == "Київ"

select cust;

foreach (var customer in customerQuery2)

{

Console.WriteLine(customer.Last + ", " + customer.First);

}

Console.ReadKey();

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