Что означает буква t в принципе last
Перейти к содержимому

Что означает буква t в принципе last

  • автор:

Требования ACID на простом языке

Мне нравятся книги из серии Head First O`Reilly — они рассказывают просто о сложном. И я стараюсь делать также.

Когда речь идёт о базах данных, могут всплыть магические слова «Требования ACID». На собеседовании или в разговоре разработчиков — не суть. В этой статье я расскажу о том, что это такое, как расшифровывается ACID и что означает каждая буква.

Требования ACID — набор требований, которые обеспечивают сохранность ваших данных. Что особенно важно для финансовых операций. Мы же не хотим остаться без денег из-за разрыва соединения или ошибки в ПО, не так ли?

Давайте пройдемся по каждой букве ACID и посмотрим на примерах, чем архив лучше 10 разных файлов. И чем транзакция лучше 10 отдельных запросов.

  1. Atomicity — Атомарность
  2. Consistency — Согласованность
  3. Isolation — Изолированность
  4. Durability — Надёжность

Atomicity — Атомарность

Атомарность гарантирует, что каждая транзакция будет выполнена полностью или не будет выполнена совсем. Не допускаются промежуточные состояния.

Друг познается в беде, а база данных — в работе с ошибками. О, если бы всё всегда было хорошо и без ошибок! Тогда бы никакие ACID были бы не нужны. Но как только возникает ошибка, атомарность становится очень важна.

Допустим, вы решили отправить маме деньги. Когда вы делаете перевод внутри банка, что происходит:

  1. У вас деньги списались
  2. Маме поступили

И допустим, что у нас 2 отдельных запроса. А теперь посмотрим, что будет при возникновении ошибок:

1. У вас на балансе нет нужной суммы — система вывела сообщение об ошибке, но катастрофы не произошло, атомарность тут не нужна.

2. У мамы заблокирована карточка, истек срок годности — деньги ей не поступили. Запрос отменен. Но минуточку. У вас то они уже списались!

Ошибка на первом этапе никаких проблем в себе не таит. А вот ошибка на втором. Приводит к потере денег, что явно недопустимо.

Если мы отправляем отдельные запросы, система не может связать их между собой. Запрос упал с ошибкой? Система его отменяет. Но только его, ведь она не знает о том, что запрос «у меня деньги спиши» связан с упавшим «сюда положи»!

Транзакция же позволяет сгруппировать запросы, то есть фактически показывает базе на взаимосвязи между ними. База сама о связях ничего не знает! Это знаете только вы =)

И если падает запрос внутри транзакции, база откатывает всю транзакцию. И приходит в состояние «как было до начала транзакции». Даже если там внутри было 10 запросов, вы можете спать спокойно — сломался один, откатятся все.

Consistency — Согласованность

Транзакция, достигающая своего нормального завершения (EOT — end of transaction, завершение транзакции) и, тем самым, фиксирующая свои результаты, сохраняет согласованность базы данных. Другими словами, каждая успешная транзакция по определению фиксирует только допустимые результаты ​ wikipedia

Это свойство вытекает из предыдущего. Благодаря тому, что транзакция не допускает промежуточных результатов, база остается консистентной. Есть такое определение транзакции: «Упорядоченное множество операций, переводящих базу данных из одного согласованного состояния в другое». То есть до выполнения операции и после база остается консистентной (в переводе на русский — согласованной).

Например, пользователь в системе заполняет карточку:

  • ФИО
  • Дата рождения
  • ИНН
  • Телефон — отдельно код страны, города и номер
  • Адрес — тоже разбит на несколько полей

В базе данных у нас есть несколько таблиц:

Так что когда пользователь заполнил форму и нажал «сохранить», система отправляет в базу данных 3 запроса:

insert into client… -- вставить в таблицу клиентов такие-то данные insert into phone… insert into address…

Можно отправить 3 разных запроса, но лучше сделать одну транзакцию, внутри которой будут эти 3 запроса.

Атомарность гарантирует, что не получится такого, что адрес с телефоном сохранились, а сам клиент — нет. Это сделало бы базу неконсистентной, ведь у нас бы появились атрибуты, «висящие в воздухе», никому не принадлежащие. Что, в свою очередь, приведет к ошибкам в системе.

За консистентностью должен следить разработчик. Ведь это вопрос скорее бизнес-логики, чем технологий. Те же атрибуты, «висящие в воздухе» — это разработчик знает, что:

  • если есть телефон в таблице phone
  • он должен ссылаться на таблицу client

База об этом не знает ничего, если ей не рассказать. И она легко пропустит запрос «добавь в базу телефон без ссылки на клиента», если сам по себе запрос корректный, а разработчик не повесил на таблицу foreign key.

Можно повесить на таблицу constraint. Например, «баланс строго положительный». Тогда сценарий с ошибкой будет выглядеть так:

1. Пользователь пытается перевести другу 100р, хотя у него самого 10

2. Система отправляет в базу запрос — «обнови баланс карты, теперь там X – 100».

3. База пытается выполнить запрос, но ой! Нарушен constraint, в итоге операции баланс стал отрицательным, эту ошибку она и возвращает.

4. Система обрабатывает ошибку и выводит ее пользователю в читаемом виде.

К сожалению, нет единого механизма рассказать базе о том, какое состояние считается согласованным. Разработчик может использовать foreign ключи, какие-то констрейнты — это БД проверит. Но что с одного счета списалось, а на другой пришло — это БД уже не проверит. Это бизнес-логика.

Разработчик пишет код, пошагово переводящий БД в нужное согласованное состояние и, если где-то посередине возникает ошибка или нежданчик, откатывает всю транзакцию. То есть можно после каждого шага делать запрос, проверяя какое-то поле:

— Эй, баланс, ты ведь положительный остался?

— Ку-ку, тебе деньги пришли?

Если вдруг проверка не прошла, то кидаем ошибку и делаем откат.

Isolation — Изолированность

Во время выполнения транзакции параллельные транзакции не должны оказывать влияния на её результат.

Если у нас система строго для одного человека, проблем не будет. А если пользователей несколько? Тогда транзакции запускают в параллель — для ускорения работы системы. А иначе представьте себе, что вы делаете заказ в интернет-магазине и система вам говорит: «Вы в очереди, перед вами еще 100 человек хотят заказ оформить, подождите». Бред же? Бред!

Вот и приходится распараллеливать запросы. Но к каким эффектам может привести параллельная работа двух транзакций?

1 эффект: «Потерянная запись»

Есть некий счет А, на котором лежит 500 у.е.

Кассир 1 (К1 на рисунке) списал с него 300 у.е. Обозначим его действия рыжими стрелками. Списал 300, на выходе получает 200 = 500 — 300.

Кассир 2 (К2) тоже решил обратиться к этому же счету, и записал туда 300 у.е., пока К1 еще не успел закрыть свою транзакцию. Так как первая транзакция не закрыта, сумма на счете до сих пор 500, получаем 500 + 300 = 800.

Итог — мы «потеряли запись» первого кассира, ведь на выходе у нас А = 800, хотя должно быть 500. «Кто последний вписал результат — того и тапки». Получается так.

2 эффект: «Грязное чтение»

Есть некий счет А, на котором лежит 500 у.е.

Кассир 1 списал с него 300 у.е. Обозначим его действия рыжими стрелками. Списал 300. Потом передумал и сделал откат — на выходе остались те же 500 у.е.

Кассиру 2 (К2) понадобилась информация по этому счету и он ее считал до того, как К1 закрыл свою транзакцию.

Итог — второй кассир считал неверную сумму, построил неверный отчет/отказал в визе платежеспособному гражданину и т.д.

3 эффект: «Повторимое чтение»

Есть некие данные.

Кассир 1 строит отчет. Операции идут последовательно для каждой колонки. Система считала данные, записала в первую колонку (например, взяв минимум от них).

Обозначим получение данных зеленым цветом, а изменение — рыжим.

Кассир 2 влез в эту таблицу данных и изменил некоторые счета в ней.

У кассира 1 продолжается построение отчета. И во вторую колонку система считывает уже новые данные.

Итог — отчет построен на основании разных данных.

4 эффект: «Фантомы»

Есть некие данные.

Кассир 1 строит отчет. Операции идут последовательно для каждой колонки. Система считала данные, записала в первую колонку (например, взяв минимум от них).

Обозначим получение данных зеленым цветом, а изменение — рыжим.

Кассир 2 влез в эту таблицу данных и добавил новые счета/удалил некоторые старые.

У кассира 1 продолжается построение отчета. И во вторую колонку система считывает уже новые данные.

Итог — отчет построен на основании разных данных.

Разница между 3-им и 4-ым эффектами в том, что в одном случае данные изменяются, а во втором — добавляются/удаляются. То есть меняется ещё и их количество.

Как бороться

Как бороться с этими проблемами? Нужно изолировать транзакцию. Способов есть несколько, но основные — блокировки и версии.

Блокировки — это когда мы блокируем данные в базе. Можно заблокировать одну строку в таблице, а можно всю таблицу. Можно заблокировать данные на редактирование, а можно и на чтение тоже.

Подробнее о блокировках можно почитать тут:

  • Блокировка (СУБД) — статья из вики
  • Режимы блокировки — здесь хорошо описано, в чем отличие эксклюзивной от разделямой блокировки
  • Transaction Isolation Levels in DBMS — статья на английском, но хорошо прошлись по разным уровням изоляции базы

Версии — это когда внутри базы при каждом обновлении создается новая версия данных и сохраняется старая. Версионирование скрыто от разработчика, то есть мы не видим в базе никаких номеров версий и данных по ним. Просто пока транзакция, обновляющая запись, не покомитит свое изменение, остальные потребители читают старую версию записи и не блокируются.

Durability — Надёжность

Если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя. Обесточилась система, произошел сбой в оборудовании? На выполненную транзакцию это не повлияет.

См также:

Правило LAST

Правило LAST — это правило поведения в конфликтной ситуации, когда нужно выслушать гостя, извиниться, решить проблему и поблагодарить.

При любом обращении, выслушайте гостя, не отворачивайтесь и не отвлекайтесь от него, покажите искреннюю заинтересованность.

Затем извинитесь, даже если Вы ни в чём не виноваты. Для гостя Вы – лицо ресторана, в котором ему что-то не понравилось, и он имеет право высказать вам свою проблему. Скажите: «Мне жаль, что вас коснулась эта проблема. Я сделаю всё, что в моих силах, чтобы это исправить».

S – Примите решение.

Решите проблему гостя. При этом, помните, что существует две категории жалоб. Удовлетворение жалоб первой категории находится в компетенции кассира. Это жалобы, связанные с

* неправильно выполненным заказом (гостю что-то не пробили или не положили)

* неправильной упаковкой (в зале или «на вынос»)

* медленным или негостеприимным обслуживанием

* отсутствием чистоты в зале.

В таких ситуациях кассиру нужно немедленно решить проблему. Как правильно это сделать, вас научит тренер наставник в вашем ресторане, так как специфика ресторанов разная, и решения таких проблем могут различаться.

Например, если был подан неверный заказ (кассир не услышал, или не понял), необходимо извиниться перед гостем, заменить верными составляющими или переделать заказ.

Жалобы второй категории находятся полностью в компетенции менеджера: некачественная продукция, замена блюда, если гость его уронил, посторонние предметы в пище и т.д.

В таких случаях решением проблемы со стороны кассира будет вызов менеджера. Также это необходимо сделать в любой ситуации, когда гость сам просит позвать менеджера (даже, если решить проблему может кассир).

После того, как Вы решили проблему гостя, его необходимо поблагодарить.

Мы должны поблагодарить Гостя по двум причинам: во-первых, он позволил нам исправить его неблагоприятное впечатление. По статистике, 9 из 10-ти недовольных Гостей уходят, ничего не сказав, и больше не возвращаются. Гость, обратившийся с жалобой и позволивший её удовлетворить, вероятнее всего, вернётся к нам снова.

Во-вторых, после жалобы мы постараемся не допустить подобного впредь, а значит – остальные Гости будут довольны!

Действия в нестандартных ситуациях:

Ситуация Действия кассира Примеры общения с гостем
Сбор заказа задерживается (нет упаковки или нет готовых блюд и т.п.) 1. Выяснить точное время готовности заказа; 2. Извиниться и четко и позитивно сообщить Гостю, когда заказ будет готов. «Прошу прощения. Ваш заказ будет готов через 2 минуты».
Гость заказал блюдо, которого сегодня нет в меню (Стоп лист) 1. Извиниться и сообщить, что сегодня данного блюда нет в меню. 2. С улыбкой предложить взамен похожее блюдо, озвучив его выгоду для гостя. Если не можете сориентироваться, что предложить, предложите новинку или блюдо по акции. «Прошу прощения, сегодня этого блюда нет в меню. Взамен могу предложить Вам более вкусный/популярный/ острый/бодрящий (или другое под-ходящее «вкусное слово») … или нашу новинку».
Гость заказал блюдо, которого нет в меню Бургер Кинг, или блюдо, кото-рое вывели из меню 1. Извиниться и сообщить, что такого блюда нет в меню Бургер Кинг 2. С улыбкой предложить взамен ассорти-мент блюд, аналогичных заказанному. 3. Сразу же задать вопрос о предпочтениях гостя, показав тем самым свою заботу о нем. «Прошу прощения. Такого блюда нет в меню Бургер Кинг. Могу вам предложить наши … (линейку сандвичей, горячие напитки, гарниры и т.д.)! Вы предпочитаете (острые или неострые блюда, чай или кофе, и т.д.)?»
Гость обращается с жалобой. Общаться с Гостем, используя правило LAST.
Гость обращается с вопросом или просьбой. 1. Если ответ на вопрос или удовлетворение просьбы находится в ва-ших силах и компетенции, помогите Гостю. 2. Если Вы не можете помочь, немедленно пригласите менеджера. «Прошу прощения, к сожале-нию, я не могу ответить на Ваш вопрос. Если хотите, я могу немедленно позвать менеджера, и он с удовольствием Вам ответит!».
Вопросы, на которые может дать ответ кассир: • Меню (ассортимент, цены), состав блюд, ингредиенты (например, если у Гостя аллергия на какой-то продукт, он может задать вопрос о его наличии в блюде, и т.п.). • Акции, проводимые в ресторане и промо для Гостей. • Часы работы ресторана. • Расположение туалетов и т.п. Если Вы не знаете точных ответов на эти вопросы, то их необходимо немедленно переадресовать менеджеру. При этом, Вы должны показать Гостю заинтересованность и участие. Любая просьба Гостя, если она ведёт к нарушению трудового распорядка (размен денег, просьба донести поднос до столика и др.) может быть выполнена только с разрешения менеджера.
Гость решил изменить заказ. 1. Пригласить менеджера для корректировки заказа. 2. Ещё раз уточнить пожелания гостя. 3. Снова повторить заказ Гостю и назвать сумму.
Гость роняет продукт на пол. Позвать менеджера, чтобы он принял решение о замене продукта.
Гость задаёт вопрос о работе в Бургер Кинг. Немедленно позвать менеджера. «Вероятнее всего, нам требуются сотрудники. Подождите минутку, я позову менеджера, и он с радостью ответит на все Ваши вопросы!».
Гость задаёт вопрос о работе в Бургер Кинг. Немедленно позвать менеджера. «Вероятнее всего, нам требуются сотрудники. Подождите минутку, я позову менеджера, и он с радостью ответит на все Ваши вопросы!».
Гость просит книгу отзывов и предложений. Незамедлительно позвать менеджера, объяснив ему суть ситуации. «Пожалуйста, подождите одну минуту, я позову менеджера».
Гость просит изменить состав блюда. 1. Объяснить Гостю, что мы можем, по его желанию, убрать или добавить какой-либо ингредиент за дополнительную плату 2. Если гость просит блюдо без какого-либо ингредиента, попросить его подождать приготовления спец. заказа. 3. Сообщить сотрудникам кухни о специальной просьбе Гостя.
Гость не согласен с общей стоимостью заказа. 1. Извиниться перед Гостем. 2. Проверить соответствие заказанных и введенных пунктов. 3. Проверить соответствие цен по пунктам меню. 4. Объяснить, как набор блюд сказывается на цене. «Простите, пожалуйста. Давайте проверим Ваш заказ».
Спор относительно банкнот (подозрение на мошенничество). 1. Оповестить менеджера. 2. Вместе с менеджером, в присутствии Гостя, снять кассу и пересчитать содержимое для проверки недостачи или излишка. «Прошу прощения. Сейчас я позову менеджера, и он пересчитает кассу».
Кассир не может дать сдачу. Вызвать менеджера, чтобы получить разменные деньги. НИ В КОЕМ СЛУЧАЕ САМОСТОЯТЕЛЬНО НЕ МЕНЯТЬ ДЕНЬГИ В ДРУГИХ КАССАХ!
Гость пытается расплатиться фальшивыми деньгами. Попросить гостя подождать и немедленно позвать менеджера. «Прошу прощения, небольшая техническая трудность. Подо-ждите минуту, я позову мене-джера».
Пьяный/грубый гость. Сообщить менеджеру и дежурному администратору.
Лица в зале, мешающие гостям (бомжи, попрошайки и т.п.). Сообщить менеджеру и дежурному администратору.
Гость с ребёнком (детьми). 1. Поприветствовать детей отдельно, особенными словами. 2. Принимая заказ, основываться на выборе родителей. 3. Не предлагать блюда и напитки напрямую детям (если только родители не просят об этом сами). 4. Обращаться к детям в процессе обслуживания на «Вы».
Ограбление. 1. Если возможно, сообщить менеджеру и дежурному администра-тору. 2. Выполнять все требования грабителей. 3. Стараться запомнить, как грабители вы-глядят: — возраст, — рост, — комплекцию, — цвет волос, — цвет глаз, — наличие бороды, — шрамы, татуировки или какие-либо характерные приметы, — тип и цвет одежды и обуви. 4. Сразу же после того, как грабители ушли, сообщить менеджеру и вызвать полицию.
Угроза взры-ва. Сообщить менеджеру и дежурному администратору. Во избежание возможного взрыва запрещается: — трогать и перемещать подозрительный предмет, — пользоваться электро- и радиоаппаратурой поблизости от подозрительного предмета, — оказывать тепловое, звуковое, механическое и электромагнитное воздействие на подозрительный предмет.
Поломка оборудования на кассе. 1. Извиниться перед гостем. 2. Позитивно попросить гостя подождать, объяснив причину. 3. Позвать менедже-ра. «Простите, пожалуйста, у нас произошли некоторые техниче-ские трудности. Нужно немного подождать. Я немедленно позову менеджера, чтобы решить проблему!».
Несовершеннолетние гости хотят купить пиво. 1. Извиниться. 2. Попросить доку-мент, удостоверяющий личность с указанием да-ты рождения. 3. При необходимости, позвать менеджера. «Прошу прощения. Мы не про-даем алкогольные напитки гос-тям до 18 лет. Покажите, пожа-луйста, паспорт».

Что означает буква t в принципе last

13 августа 2015

К огда из дверей вашего офиса выходит разочарованный, недовольный клиент , вы теряете деньги. Покупатель не только пожалуется на вас родственникам и знакомым, но и напишет нехороший пост в Facebook . Мало того, что такие посты просто неприятны, сегодня из них может вырасти настоящий холивар. Есть способ вернуть расположение клиента, пока он еще не вышел за порог. Это простой и универсальный метод. Он состоит из 4 компонентов:

  1. L isten (выслушай).
  2. A pologize (извинись).
  3. S olve (прими меры).
  4. T hank (поблагодари).

Обязательно услышьте недовольного клиента, разберитесь в причинах его негодования. Клиент как девушка — очень важно выслушать сразу, как только появился намек на проблему или недосказанность в ваших отношениях. Выслушать сразу, без препираний и возражений — это единственный шанс не допустить скандала. Даже если «Директор уехал и вернется через 3 дня!», всегда должен быть сотрудник, который имеет полномочия и способность решить проблему покупателя.

Где клиенты капризничают больше всего? В ресторанах. Когда открылся первый ресторан Café Rocket, его владелец Альберт Барнето усовершенствовал правило «выслушай», приучив своих сотрудников следовать правилу «Верь». Клиент может заблуждаться или откровенно лгать, но решать конфликтную ситуацию нужно с позиции доверия. Поверьте, что ваша компания на самом деле обидела клиента, и устраните эту проблему.

Не нужно выяснять, на чьей стороне истина. Извинитесь за то, что ваш клиент огорчился. Дважды извинитесь, если он огорчился по вашей вине.

Совет, которым, возможно, не все захотят воспользоваться: извиняйтесь перед клиентами даже тогда, когда не имеете отношения к их плохому настроению. И всегда делайте это искренне. Следите за тем, чтобы ваши сотрудники на самом деле хотели помочь покупателям решить их трудности. Это еще и отличный способ узнать насколько счастливы ваши люди, работая у вас.

Почему не все захотят воспользоваться таким советом? Потому что у нас фразу «клиент всегда прав» все еще понимают не до конца. А в этом как раз и состоит клиентоориентированность, без которой компаниям по всему миру дальше никак.

S olve (прими меры)

Сделайте все возможное, чтобы исправить свою ошибку. Если рассмотрение вопроса требует времени, нужно незамедлительно начать эту процедуру. Главное, чтобы покупатель видел, что вы на самом деле стараетесь.

Компания может сделать клиенту ценный подарок без ущерба своему финансовому состоянию. Это действенный способ, чтобы восстановить расположение человека. К примеру, менеджеры по оптовым продажам компании P & G сами решают, какое возмещение предложить покупателю. Это может быть дополнительная скидка, пробники новой продукции, торговое оборудование с корпоративным логотипом. Им не нужно обращаться к руководству за разрешением и тратить время клиента. Так компания не только заботится о покупателях, но проявляет доверие к сотрудникам.

T hank (поблагодари)

Каждый отзыв о компании ни в коем случае не должен злить вас или заставлять загордиться. Это всего лишь инструмент, который помогает бизнесу совершенствоваться. Обязательно поблагодарите клиента за внимание и доверие. Будьте искренни, чтобы добиться расположения. Иногда искренности, стоит подучиться.

В Starbucks на основе принципа LAST создали корпоративный метод LATTE:

  • Li sten (выслушай).
  • A cknowledge (согласись).
  • T ake action (реши проблему).
  • T hank (поблагодари).
  • Encourage (пригласи прийти еще раз).

Следуя этому принципу, можно построить такой же клиентский сервис как у Starbucks. Почему нет, попробуйте.

Правило LAST можно использовать в любой сфере бизнеса. Адаптируйте его под свои условия, как это сделали другие компании. Стремитесь быть полезными, и клиенты останутся с вами.

LINQ

LINQ (Language-Integrated Query) представляет простой и удобный язык запросов к источнику данных. В качестве источника данных может выступать объект, реализующий интерфейс IEnumerable (например, стандартные коллекции, массивы), набор данных DataSet, документ XML. Но вне зависимости от типа источника LINQ позволяет применить ко всем один и тот же подход для выборки данных.

Существует несколько разновидностей LINQ:

  • LINQ to Objects : применяется для работы с массивами и коллекциями
  • LINQ to Entities : используется при обращении к базам данных через технологию Entity Framework
  • LINQ to XML : применяется при работе с файлами XML
  • LINQ to DataSet : применяется при работе с объектом DataSet
  • Parallel LINQ (PLINQ) : используется для выполнения параллельных запросов

В этой главе речь пойдет прежде всего о LINQ to Objects , но в последующих материалах также будут затронуты и другие разновидности LINQ. Основная часть функциональности LINQ сосредоточена в пространстве имен System.LINQ . В проектах под .NET 6 данное пространство имен подключается по умолчанию.

В чем же удобство LINQ? Посмотрим на простейшем примере. Выберем из массива строки, которые начинаются на определенную букву, например, букву «T», и отсортируем полученный список:

string[] people = < "Tom", "Bob", "Sam", "Tim", "Tomas", "Bill" >; // создаем новый список для результатов var selectedPeople = new List(); // проходим по массиву foreach (string person in people) < // если строка начинается на букву T, добавляем в список if (person.ToUpper().StartsWith("T")) selectedPeople.Add(person); >// сортируем список selectedPeople.Sort(); foreach (string person in selectedPeople) Console.WriteLine(person);

Для отфильтрованных строк создается специальный список. Затем в цикле проходим по всем элементам массива и, если они соответствуют условию (начинаются на букву T), то добавляем их в этот список. Затем сортируем список по возрастанию. И в конце элементы полученного списка выводим на консоль:

Tim Tom Tomas

Хотя подобный подход вполне работает, однако LINQ позволяет значительно сократить код с помощью интуитивно понятного и краткого синтаксиса.

Для работы с колекциями можно использовать два способа:

  • Операторы запросов LINQ
  • Методы расширений LINQ Рассмотрим оба способа

Операторы запросов LINQ

Операторы запросов LINQ в каком-то роде частично напоминают синтаксис запросов SQL, поэтому если вы работали когда-нибудь с sql-запросами, то будет проще понять общую концепцию. Итак, изменим предыдущий пример, применив операторы запросов LINQ:

string[] people = < "Tom", "Bob", "Sam", "Tim", "Tomas", "Bill" >; // создаем новый список для результатов var selectedPeople = from p in people // передаем каждый элемент из people в переменную p where p.ToUpper().StartsWith("T") //фильтрация по критерию orderby p // упорядочиваем по возрастанию select p; // выбираем объект в создаваемую коллекцию foreach (string person in selectedPeople) Console.WriteLine(person);

Прежде всего, как мы видим, код стал меньше и проще, а результат будет тем же. В принципе все выражение можно было бы записать в одну строку:

var selectedPeople = from p in people where p.ToUpper().StartsWith("T") orderby p select p;

Но для более понятной логической разбивки я поместил каждое отдельное подвыражение на отдельной строке. Простейшее определение запроса LINQ выглядит следующим образом:

from переменная in набор_объектов select переменная;

Итак, что делает этот запрос LINQ? Выражение from p in people проходит по всем элементам массива people и определяет каждый элемент как p . Используя переменную p мы можем проводить над ней разные операции. Несмотря на то, что мы не указываем тип переменной p , выражения LINQ являются строго типизированными. То есть среда автоматически распознает, что набор people состоит из объектов string, поэтому переменная p будет рассматриваться в качестве строки. Далее с помощью оператора where проводится фильтрация объектов, и если объект соответствует критерию (в данном случае начальная буква должна быть «T»), то этот объект передается дальше. Оператор orderby упорядочивает по возрастанию, то есть сортирует выбранные объекты. Оператор select передает выбранные значения в результирующую выборку, которая возвращается LINQ-выражением. В данном случае результатом выражения LINQ является объект IEnumerable . Нередко результирующая выборка определяется с помощью ключевого слова var , тогда компилятор на этапе компиляции сам выводит тип.

Методы расширения LINQ

Кроме стандартного синтаксиса from .. in .. select для создания запроса LINQ мы можем применять специальные методы расширения, которые определены для интерфейса IEnumerable . Как правило, эти методы реализуют ту же функциональность, что и операторы LINQ типа where или orderby . Например:

string[] people = < "Tom", "Bob", "Sam", "Tim", "Tomas", "Bill" >; var selectedPeople = people.Where(p => p.ToUpper().StartsWith("T")).OrderBy(p => p); foreach (string person in selectedPeople) Console.WriteLine(person);

Запрос people.Where(p=>p.ToUpper().StartsWith(«T»)).OrderBy(p => p) будет аналогичен предыдущему. Он состоит из цепочки методов Where и OrderBy. В качестве аргумента эти методы принимают делегат или лямбда-выражение. И хотя ряд действий мы можем реализовать как с помощью операторов запросов LINQ, так и с помощью методов расширений LINQ, но не каждый метод расширения имеет аналог среди операторов LINQ. И в этом случае можно сочетать оба подхода. Например, используем стандартный синтаксис linq и метод расширения Count(), который возвращает количество элементов в выборке:

int number = (from p in people where p.ToUpper().StartsWith("T") select p).Count(); Console.WriteLine(number); // 3

Список используемых методов расширения LINQ

  • Select : определяет проекцию выбранных значений
  • Where : определяет фильтр выборки
  • OrderBy : упорядочивает элементы по возрастанию
  • OrderByDescending : упорядочивает элементы по убыванию
  • ThenBy : задает дополнительные критерии для упорядочивания элементов возрастанию
  • ThenByDescending : задает дополнительные критерии для упорядочивания элементов по убыванию
  • Join : соединяет две коллекции по определенному признаку
  • Aggregate : применяет к элементам последовательности агрегатную функцию, которая сводит их к одному объекту
  • GroupBy : группирует элементы по ключу
  • ToLookup : группирует элементы по ключу, при этом все элементы добавляются в словарь
  • GroupJoin : выполняет одновременно соединение коллекций и группировку элементов по ключу
  • Reverse : располагает элементы в обратном порядке
  • All : определяет, все ли элементы коллекции удовлятворяют определенному условию
  • Any : определяет, удовлетворяет хотя бы один элемент коллекции определенному условию
  • Contains : определяет, содержит ли коллекция определенный элемент
  • Distinct : удаляет дублирующиеся элементы из коллекции
  • Except : возвращает разность двух коллекцию, то есть те элементы, которые создаются только в одной коллекции
  • Union : объединяет две однородные коллекции
  • Intersect : возвращает пересечение двух коллекций, то есть те элементы, которые встречаются в обоих коллекциях
  • Count : подсчитывает количество элементов коллекции, которые удовлетворяют определенному условию
  • Sum : подсчитывает сумму числовых значений в коллекции
  • Average : подсчитывает cреднее значение числовых значений в коллекции
  • Min : находит минимальное значение
  • Max : находит максимальное значение
  • Take : выбирает определенное количество элементов
  • Skip : пропускает определенное количество элементов
  • TakeWhile : возвращает цепочку элементов последовательности, до тех пор, пока условие истинно
  • SkipWhile : пропускает элементы в последовательности, пока они удовлетворяют заданному условию, и затем возвращает оставшиеся элементы
  • Concat : объединяет две коллекции
  • Zip : объединяет две коллекции в соответствии с определенным условием
  • First : выбирает первый элемент коллекции
  • FirstOrDefault : выбирает первый элемент коллекции или возвращает значение по умолчанию
  • Single : выбирает единственный элемент коллекции, если коллекция содержит больше или меньше одного элемента, то генерируется исключение
  • SingleOrDefault : выбирает единственный элемент коллекции. Если коллекция пуста, возвращает значение по умолчанию. Если в коллекции больше одного элемента, генерирует исключение
  • ElementAt : выбирает элемент последовательности по определенному индексу
  • ElementAtOrDefault : выбирает элемент коллекции по определенному индексу или возвращает значение по умолчанию, если индекс вне допустимого диапазона
  • Last : выбирает последний элемент коллекции
  • LastOrDefault : выбирает последний элемент коллекции или возвращает значение по умолчанию

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *