Делегаты и Лямбдас и LINQ, Oh My!

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

Я нахожусь в проекте, который включает в себя мою потребность изучить ряд новых (для меня) технологий, включая LINQ (для OBJECTS и XML для целей этого проекта) и другие. Все, что я прочитал до сих пор, говорит о том, что для использования LINQ мне нужно будет полностью понять следующее (Делегаты, Анонимные методы и Лямбда-выражения).

Хорошо, так что теперь пришло удовольствие. В прошлом у меня были делегаты CONSUMED, поскольку я работал с моделью событий .NET, но большинство деталей были скрыты от меня (спасибо Microsoft!). Я понимаю, что на базовом уровне экземпляры делегирования являются указателями на методы (грубое чрезмерное упрощение, я знаю).

Я понимаю, что анонимный метод - это, по сути, встроенный неназванный метод, как правило, (если не исключительно), созданный как цель для делегата.

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

Простите меня, если мое из моих описаний здесь ПУТЬ, это базовый уровень, на который я понимаю эти темы.

Итак, задача:

  • Может ли кто-нибудь сказать мне, если хотя бы на базовом уровне, если мое понимание этих предметов даже близко? Я не ищу сложные эзотерические мелочи, просто основы (на данный момент).

  • В какой степени мне нужно по-настоящему понять эти понятия перед тем, как применить LINQ в проекте к разумному эффекту? Я хочу полностью понять это и желаю потратить время. Я просто не могу ПОЛУЧИТЬ время, чтобы полностью изучить все эти вещи, прежде чем мне нужно будет произвести некоторую работу.

  • Может ли кто-нибудь указать мне на некоторые хорошие статьи, которые объясняют эти темы и применяют их к примерам "реального мира", чтобы я мог разглядеть основы этих тем и их применения? То, что я имею в виду под реальным миром, это то, как я могу использовать это в контексте "Клиенты и счета-фактуры", а не абстрактные "Векторы и фигуры" или "Животные и коровы". Сценарий может быть несколько надуман для демонстрационных целей, но, надеюсь, не строго академический. Я нашел несколько примеров он-лайн и в книгах, но мало кто из них объясняет "простой английский".

Спасибо всем за ваше терпение, время и знания.

Ответ 1

1) Эти описания звучат довольно точно для меня. Иногда анонимным методам и лямбда-выражениям необходимо создать новый тип для размещения цели делегата, поэтому они могут действовать как closures.

2/3) Я бы немного прочитал, пока вас не устраивают делегаты, анонимные методы и лямбда-выражения. Я посвящаю главу связанным с делегатом изменениям в каждом из С# 2.0 и С# 3.0 в С# в глубине, хотя, конечно, другие книги также входят в детали. У меня есть статья, если это помогает.

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

  • Предоставление кода для вызова при запуске нового потока
  • Реакция на события пользовательского интерфейса
  • Предоставление фильтра, выбора, заказа и т.д. для запроса LINQ
  • Предоставление обратного вызова для завершения асинхронной операции

Если у вас есть какие-то конкретные ситуации, на которые вы хотели бы ответить, это будет легче ответить.

EDIT: я должен отметить, что хорошие новости о том, что вы работаете с LINQ для объектов и LINQ to XML на данный момент, так как это означает, что вам пока не нужно понимать деревья выражений. (Они классные, но один шаг за раз...) LINQ to XML - это всего лишь XML API, который отлично работает с LINQ - из того, что я помню, единственные времена, когда вы будете использовать делегатов с LINQ to XML, - это когда вы на самом деле вызываете LINQ to Objects. (Это очень приятно делать, правда, но это означает, что вы можете повторно использовать то, что уже узнали.)

Поскольку у вас уже есть С# в Depth, главы 10 и 11 содержат довольно много примеров использования лямбда-выражений (и выражений запроса, которые переводятся в лямбда-выражения) в LINQ. В главе 5 есть несколько различных примеров использования делегатов.

Ответ 2

Где я могу найти подробное руководство по С# 3?

1) Ваши знания пока все в порядке. Лямбда-выражения превращаются в анонимные методы или System.Linq.Expressions.Expression, в зависимости от контекста. Поскольку вы не используете технологию баз данных, вам не нужно понимать выражения (все lambdas будут анонимными методами). Вы не указали методы расширения, но это очень важно (и легко) понять. Убедитесь, что вы видите, как применить метод расширения к интерфейсу, поскольку все функции linq поступают из System.Linq.Enumerable - набор методов расширения для IEnumerable (Of T).

2) Вам не нужно глубокое понимание лямбда.

Синтаксис стрелок (= > ) был для меня самым большим препятствием. Стрелка разделяет подпись и тело выражения лямбда.

Всегда помните: Методы Linq не выполняются до тех пор, пока не будут перечислены.

Остерегайтесь использования переменных цикла в лямбда. Это побочный эффект от отложенного исполнения, особенно сложный для отслеживания.

3) Конечно, вот некоторые из моих ответов, которые показывают вызовы метода linq - некоторые с xml.

Ответ 3

Прочтите это...

http://linqinaction.net/

.. и все, на что вы отвечаете, будут отвечать!