Делегаты и Lambdas и LINQ, о мой! - PullRequest
12 голосов
/ 13 января 2009

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

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

ОК, теперь самое интересное. Я ПОТРЕБЛЯЛ делегатов в прошлом, когда работал с моделью событий .NET, но большинство деталей было скрыто от меня (спасибо Microsoft!). Я понимаю, что на базовом уровне экземпляры делегатов являются указателями на методы (я знаю, что это чрезмерное упрощение).

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

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

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

Итак, вызов:

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

  2. В какой степени мне нужно по-настоящему понимать эти концепции, прежде чем применять LINQ в проекте с разумной эффективностью? Я хочу понять это полностью и готов провести время. У меня просто может не быть ВРЕМЕНИ, чтобы полностью проглотить все это, прежде чем мне нужно будет произвести какую-то работу.

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

Заранее благодарим всех за терпение, время и опыт.

Ответы [ 3 ]

6 голосов
/ 13 января 2009

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

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

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

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

Всегда помните: Методы Linq не выполняются до нумерации.

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

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

5 голосов
/ 13 января 2009

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

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

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

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

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

РЕДАКТИРОВАТЬ: Я должен отметить, что это хорошая новость, что вы в настоящее время работаете только с LINQ to Objects и LINQ to XML, поскольку это означает, что вам еще не нужно понимать деревья выражений. (Они крутые, но по одному шагу за раз ...) LINQ to XML - это на самом деле просто XML API, который прекрасно работает с LINQ - насколько я помню, единственные случаи, когда вы будете использовать делегатов с LINQ to XML, это когда вы на самом деле звоните в LINQ to Objects. (Это очень приятно сделать, правда, но это означает, что вы можете повторно использовать то, что вы уже узнали.)

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

1 голос
/ 13 января 2009

Читать это ...

http://linqinaction.net/

.. и на все ваши вопросы ответят !!!

...