Вибірка і зміна даних LINQ в Visual C # (Sharp)

При виконанні запиту LINQ оброблювані дані не обовязково повинні оаваться у своєму первісному вигляді Скажімо, що у нас є список клієнтів, серед яких ми вибрали групу клієнтів, що заслужили додаткові очки за лояльність компанії Ми хочемо відібрати цих клієнтів, збільшити значення їх ООВ, після чого повернути список клієнтів, чиї дані були змінені Для випоенія цього завдання застосовується LINQ в комбінації з методами розширення

Візьмемо, наприклад, таке спрощене оголошення клієнта:

class Customer {

public string Identifier public int Points

public override string ToString() {

return &quotIdentifier (&quot + Identifier + &quot) Points (&quot + Points + &quot)"

}

}

Ми створимо список, що містить двох клієнтів, один з яких має очки за лльность, а інший – ні Список створюється за допомогою наступного вихідного коду:

List&ltCustomer&gt customers = new List&ltCustomer&gt() {

new Customer { Identifier = &quotPerson 1&quot,

P o i n t s    =    0    } ,

ne w   Custome r    {    I d e n t i f i e r   =    &quotPerso n   2&quot ,

P o i n t s    =    10 }

}

Клієнти з певною кількістю очок вибираються зі списку, і їм прісвааются додаткові очки Для цього застосовується наступний оператор LINQ:

v a r   p o i n t s    =     (fro m   custome r    i n    customer s

wher e   c u s t o m e r P o i n t s    &gt    5 s e l e c t     c u s t o m e r ) S e l e c t (

(pCustomer ,    index )    = &gt    { pCustomerPoint s    + =    5

})

r e t u r n    pCustomer

Запит LINQ поєднується з операцією модифікації кількості очок Оператори LINQ from, wher e і select не є новими А ось дужки, що укладають опатор LINQ, нам ще не зустрічалися За допомогою цих дужок вказується, що оператор LINQ є обєктом, що звертається до результуючого набору даних

У прикладі для оператора (обєкта) LINQ викликається метод S elect () За допомогою цього методу всі елементи в результуючому наборі даних обробляються в циклі і передаються як параметр лямбда-виразу (pCustomer) Разом з кожним елементом передається його індекс у списку Лямбда-вираз повинен виконати певну обробку елемента і повернути результат, який повинен використовуватися в якості основи іншого списку У прикладі висловом передається примірник типу Custome r і повертається також примірник типу Customer Але до повернення примірника він обробляється додаванням допоітельних пяти бонусних очок

Може викликати заклопотаність обставина, що не виконується перевірка, чи дійсно даний клієнт заслуговує бонусні очки Але це був би привід для стурбованості, якби не застосовувалося вираз LINQ, т к це вираження відповідає за фільтрування тільки тих клієнтів, які мають отримати допоітельние бонусні очки Тому, коли викликається методSelec t о,ми впевнені на всі 100%, що додаткові бонусні очки отримають тільки ті клієнти, які заслуговують їх Це можна розглядати, як створення конвеєра мануляцій

Після знаходження певного елемента результуючий набір даних ГЕНІР за допомогою оператора і методу select () Як було показано в попе розділі, оператор select застосовується для створення нового набору даних Наприклад, як бути, якщо ви хочете знайти всіх клієнтів, що відповідають определеятся критерієм, але не хочете копіювати всі повязані дані Можливо, ви хо-

титі отримати лише ідентифікатор клієнта і накопичені у нього окуляри Для виконання цього завдання можна було б модифікувати частина select про Оператив LINQ для повернення нового типу, що оголошується динамічно Далі прищепив код попереднього прикладу, модифікований для використання анонім типу:

var points = (from customer in customers

where customerPoints &gt 5 select customer)Select( (customer, index) =&gt {

customerPoints += 5 return new {

identifier = customerIdentifier, points = customerPoints }

})

У даному прикладі ключове слово new використовується оператором return без ідеіфікатора, але має синтаксис ініціалізатора обєкта Таким чином, обявлтся анонімний тип Анонімний тип – Це екземпляр обєкта, який не має ідеіфікатора Анонімний тип має властивості, але не має методів

Анонімні типи корисні тільки в контексті методу, в якому вони оголошені Наприклад, змінна var не має типу, і її можна привласнити анонімному типу Але якщо спробувати передати примірник нетипізованого типу анонімному типу, то не буде ніякої підтримки для синтаксису

Наступний код неприпустимий:

void ExampleFunction(var obj) { }

Але давайте концентруватися на коді прикладу Його можна переписати в допустить формі таким чином:

foreach(var customer in points) {

ConsoleWriteLine(&quotCustomer (&quot + customeridentifier + &quot)(&quot + customerpoints + &quot)&quot)

}

Компілятор, що обробляє вираз LINQ, знає, що кінцевий результ набір даних містить анонімні типи з властивостями identifier і points Все це визначається, коли компілятор обробляє код С #

Але що, якщо ми хочемо маніпулювати анонімним типом Всі анонімні типи є обєктами, тому, якщо оголосити параметр методу або властивість як обєкт типу, до анонімного типу можна виконувати обігу Але викликати свотва identifier або points не можна, т к відсутня інформація про тип До свойс можна звертатися за допомогою динамічного виклику, але це складний і Меен працюючий підхід Таким чином, коротенько, при роботі з анонімними типами, не забувайте, що їх можна використовувати тільки в контексті методу, в якому вони оголошені

17 Зак 555

Досі у всіх прикладах використання LINQ обробці піддавався один набір даних LINQ дозволяє обробляти кілька потоків одночасно, але отриманий відповідь буде комбінаційного типу

Наприклад, припустимо, у нас є наступний код LINQ:

int[] setl ={1,2,3,4 , 5}

int[] set2 ={1 , 2, 3, 4, 5}

int[] set3 = { 1, 2, 3, 4, 5 }

var triples = from a in setl from b in set2 from з in set3

select new {a, b, с}

Даному коду LINQ буде ідентичний наступний псевдокод:

List&ltobject&gt items = new List&ltobject&gt() foreach (int a in setl) {

foreach (int b in set2) {foreach (int з in set3) {

itemsAdd (new {a, b, с})

}

}

}

Коли вказується кілька операторів from, то створюється механізм циклу, в кором кожен елемент обробляється спільно з іншими елементами Ця воожность може здатися корисною, але може мати катастрофічні стороя наслідки: виконання удаваного простого запиту може зайняти набагато більше часу, ніж слід Розбивши запит на окремі оператори from, можна використовувати оператори where і select в звичайному порядку

Швидше за все, ви б хотіли отримати результати вибірки в відсортованому вигляді LINQ дозволяє виконувати, сортування по будь-яким критерієм Очевидним підходом буде сортування по цифрі або букві, але можна також сортувати по довжині слова

Незалежно від обраного виду сортування, для її виконання в LINQ пріменть ключове слово orderby або метод orderByO Наступний код LINQ випояет сортування за алфавітом:

string[] words = { &quotcherry&quot, &quotapple&quot, &quotblueberry&quot }

var sortedWords = from w in words

orderby w select w

Ключове слово orderby вставляється перед оператором select В даному випадку, слова сортуються за алфавітом у зростаючому порядку

Механізм роботи ключового слова orderby полягає в порівнянні значення пеменной, а не самої змінної У даному випадку ідентифікатор w подразумевт сортування за полем w, але насправді сортування виконується не по пю w, а за значенням w

Для сортування в зворотному порядку застосовується ключове слово descending:

var sortedWords = from w in words

orderby w descending select w

Даний підхід дозволяє виконувати сортування по інших значень Наприклад, наступний код сортує по довжині слова:

var sortedWords = from w in words

orderby wLength select w

Ключове слово orderby запрошувати значення wLength, в результаті чого воращается число Якщо це число більше або менше, ніж довжина іншого слова, то сравниваемое слово поміщається після або до цього слова Зверніть увагу, що можна використовувати довільні значення, не мають ніякого відношення до елементів списку, і елементи будуть відсортовані відповідно до цих прзвольнимі значеннями

Сортування також можна виконувати за кількома критеріями Наприклад, слующій код сортує слова спочатку за алфавітом, а потім по довжині:

var sortedWords = from w in words

orderby w, wLength select w

Для сортування за кількома критеріями критерії додаються до ключового слова orderby і розділяються комами

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*