Додаткові прийоми LINQ в Visual C # (Sharp)

LINQ не є єдиним засобом для фільтрації даних З LINQ звязком кілька методів розширення, які можна застосовувати для роботи зі спкамі Наприклад, щоб відфільтрувати певний номер, можна було б воользоваться наступним кодом:

int FrequencyOfANumberList(int numberToSearch) { var query = _tickets Where (

(ticket, index) =&gt ticketNumbers[0] == numberToSearch

|| ticketNumbers[l] == numberToSearch

|| ticketNumbers[2] == numberToSearch

|| ticketNumbers[3] == numberToSearch

|| ticketNumbers[4] == numberToSearch

|| ticketNumbers[5] == numberToSearch) return queryCount()

}

Концепції LINQ, такі як оператори from, where і select, не втрачені в цьому коді вони просто не були використані прямим чином Функцію оператора from виконує сама змінна tickets, оператора where – Метод where о, а оперора select – вибір за замовчуванням, який визначається поточним вузлом

Для вказівки дії для методу where () застосовується лямбда-вираз, котому передаються два параметри-обєкт і індекс обєкта Лямбда-вираз очікує повернення булевого значення, яке зазначає, додавати чи елемент у повернутий список

За допомогою методів для роботи зі списками, асоційованих з типом, ми іользуем іншу, ніж LINQ, функціональність в абстрактному сенсі LINQ – це синтаксис, інкапсулюючий SQL-подібний текст LINQ набагато легше Пона, і в ньому набагато легше програмувати Методи надають дополнельную гнучкість, але вони більш складні в застосуванні

Наприклад, щоб обчислити частоту двох номерів в списку, можна скористатись наступним кодом:

int FrequencyOfTwoNumbersList(int numberlToSearch, int number2ToSearch) { var query = _ticketsWhere(

(ticket, index) =&gt ticketNumbers[0] == numberlToSearch

|| ticketNumbers[1] == numberlToSearch

|| ticketNumbers[2] == numberlToSearch

|| ticketNumbers[3] == numberlToSearch

|| ticketNumbers[4] == numberlToSearch

|| ticketNumbers[5] == numberlToSearch

)Where(

(ticket, index) =&gt ticketNumbers[0] == number2ToSearch

|| ticketNumbers[1] == number2ToSearch

|| ticketNumbers[2] == number2ToSearch

|| ticketNumbers[3] == number2ToSearch

|| ticketNumbers[4] == number2ToSearch

|| ticketNumbers[5] == number2ToSearch) return queryCount()

}

Виділена жирним шрифтом рядок коду демонструє використання виведення одного методу як введення для іншого методу Таке послідовне

зєднання методів працює, т к метод обробки списку повертає інші Спкі Так, можна додати множинні критерії, конкатеніруя кілька виклик методу Where ()

Методи використовуються для фільтрування або маніпуляції набором даних, де подробиці методу надаються лямбда-виразом У табл 151 дано краое опис деяких корисних методів для фільтрування і маніпуляції спкамі Кращим способом вивчення методів буде запустити Visual С # Express, оголосити список і використовувати IntelliSense, щоб дізнатися наявні методи Також безліч прикладів, які демонструють різні методи для Маніпули списками, можна знайти на Web-сторінці http://msdn2microsoftcom/en-us/ vcsharp/aa336746aspx

Таблиця 151Деякі методи для роботи зі списками

Метод

Опис

Aggregate()

Повертає відомості про список Відомостями може бути кількість парних чисел або частота певного числа Всі елементи списку обробляються в циклі, і результат повертається у вигляді едінствеого значення, а не списку

А11 0

Обробляє в циклі всі елементи списку і відповідно до лямбдираженіем виконує перевірку на повернення true або false Прерка може полягати, наприклад, у визначенні, чи мають всі обєкти значення більше, ніж 10 Перевірка повинна повертати true або false тільки для окремого обєкта, а метод All () корелює всі результати і повертає відповідь для всього списку у вигляді значення true АБО false

Any()

Те ж саме, що і метод All (), тільки перевірка виконується на сооетствіе будь-якого з елементів списку вказаній умові При положельном результаті повертається значення true, а при заперечувачем — false

Average()

Обчислює середнє послідовності значень і повертає рультат у вигляді числового значення з подвійною точністю Цей метод дещо дивний, т к для обчислення середнього потрібні числа, хоча лямбда-вираз може обчислювати середнє обєктів

Cast()

Повертає список, в якому тип кожного елемента перетворений з типу в списку в інший тип Цей метод добре підходить для групових перетворень типу примірників списку

Concat()

Конкатенуються інший список з поточним списком

Contains()

Перевіряє на наявність певного елемента в списку Метод провяет кожним елемент списку за допомогою лямбда-вирази і повертаючись true у разі успіху і false в іншому випадку

ConvertAll()

Повертає список, в якому тип кожного елемента перетворений з типу у вихідному списку в інший тип Цей метод добре підходить для групових перетворень типу примірників списку

Таблиця 151(Закінчення)

Метод

Опис

Distinct()

Видаляє всі повторення в списку За замовчуванням реалізація методу Distinct () перевіряє на рівність, викликаючи спочатку метод GetHashCode (), а потім, якщо необхідно, метод Equals () ВАРІА методу Distinct () буде перевірити два типи на рівність з пощью примірника інтерфейсу iEqualityComparer Але кращим пооди буде реалізувати методи GetHashCode () і Equals ()

Except()

Виконує операцію різниці над поточним і переданим списками і повертає результат у вигляді нового набору даних Перевірка на ренство ідентична методу Distinct ()

Find()

Знаходить певний елемент у списку Зверніть увагу, що при знаходженні елемента використовуване лямбда-вираз змусить метод Find () припинити подальшу обробку списку і повернути зазначений елемент

FindAll ()

Подібний до методу Find (), але знаходить множинні елементи у списку Те саме методом where ()

FindLast()

Те ж саме, що і Find (), тільки пошук починається з кінця списку

ForEach()

Ітератор, що використовує лямбда-вирази для обробки кожного елемента списку Метод ForEach () є спрощеним варіантом коду, показаного вчолі 9

GroupBy()

Розбиває список на підгрупи, як зазначено наданим лямбдираженіем Наприклад, можна розбити оклад співробітників фірми по групах

Intersect()

Визначає елементи, загальні для поточного і переданого списків Застосовує таку ж перевірку на рівність, як і метод Distinct ()

Max()

Визначає максимальне значення списку

Mint)

Визначає мінімальне значення списку

Reverse ()

Змінює порядок списку на протилежний

Select()

Вибирає елемент зі списку, який відповідає заданим умовам

SelectMany()

Вибирає кілька елементів зі списку, зберігаючи результат в іншій список

Sum ()

Обчислює суму елементів списку

Union()

Виконує обєднання поточного і переданого списків Використовує перевірку на рівність, як для методу Distinct ()

ПРИМІТКА

У С # 30 можливості маніпулювання списками зазнали драматичні измения в кращу сторону Загальна структура нових можливостей полягає в визначити методи, що дозволяють розробнику вказувати лямбда-вираз, який пом зєднується в ланцюжок з іншими методами Чи не згайте приділити час вивченню всіх цих можливостей

Як приклад мощі різних методів візьмемо наступний код, який стискає задачу обчислення частоти лотерейних номерів у пару рядків початково коду:

int FrequencyOfANumberFunc(int numberToSearch) {  return _ticketsSelectMany((ticket) =&gt ticketNumbers

) Where ((num) =&gt num == numberToSearch) Count () ,-

}

У прикладі інформація кожного квитка обробляється в циклі, викликаючи метод SeiectMany (), який повертає масив номерів, що представляє номера ригриша Метою методу seiectManyO є обєднання окремих масивів номерів в один великий масив Потім викликається метод where (), щоб оільтровать тільки ті номери, які збігаються з зазначеним, і, нарешті, волняется підрахунок знайдених номерів, для чого викликається метод Count ()

У наступних розділах розглядаються приклади використання методів раіренія з LINQ Приклади реалізовані у проекті консольного застосування LXNQExamples

ПРИМІТКА

Для спрощення прикладів в них застосовуються спрощені прийоми програмування Ви побачите деякі Нерекомендовані прийоми програмування, такі як створення спільних членів даних і невживання властивостей

Джерело: Гросс К С # 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>

*

*