Использование лямбда-выражения в практическом программировании - PullRequest
1 голос
/ 25 июня 2009

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

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

  1. Работа с LINQ (группировка, выбор, где и т. Д.)
  2. Мы можем передать лямбда-выражение любой функции в качестве аргумента, чтобы его можно было использовать вместо делегата, анонимной или обычной функции.
  3. Мы можем создать универсальную лямбда-функцию, которая принимает любую переменную типа данных в качестве аргумента и может возвращать любой тип данных, например,

    MyFirstLambdaFunc((val1,val2) => val1+val2)
    public R MyFirstLambdaFunc(Func lambdaexpression,T x,T y)
    {
      R Result = lambdaexpression(x, y);
      return Result;
    }
    
  4. Кодирование может быть компактным

Теперь вопрос:

  1. Есть ли другие преимущества?
  2. Когда мы передаем лямбда-выражение как функцию, можем ли мы передать только однострочную операцию?
  3. Может ли кто-нибудь иметь практический пример или какой-нибудь практический пример документа?

Заранее спасибо

Хариш Бхаттбхатт

Ответы [ 4 ]

2 голосов
/ 25 июня 2009

Для деревьев без выражений вы можете написать многострочные лямбда-выражения. Просто этим утром я написал что-то вроде:

 var query = foo.Select(x => {
               string text = x.Value;
               int delimitedIndex = text.IndexOf(' ');
               return int.Parse(text.Substring(0, delimitedIndex);
             });

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

Чтобы привести еще один пример, предположим, что вы хотите запустить несколько потоков для работы с каждым из множества значений. (Давайте проигнорируем тот факт, что мы создаем много потоков - та же техника работает и для потоковых пулов.) Вы можете использовать что-то вроде:

foreach (string url in urls)
{
    // Slight quirk due to variable capture semantics
    string urlCopy = url;
    new Thread(() => FetchUrl(urlCopy)).Start();
}

Делать это строго типизированным способом обычно сложно - есть ParameterizedThreadStart, но это не универсально, поэтому оно становится сложным. Это довольно чистое ИМО.

0 голосов
/ 25 июня 2009

Новая библиотека параллельных задач .NET 4 широко использует ее. Например, если вы хотите запустить блок кода параллельно, вы можете написать:

 Parallel.For(1, 10, i =>
 {
   // do work
 });

На мой взгляд, это работает намного лучше, чем просто передать ему метод, например:

 Parallel.For(1, 10, SomeMethodWithIntAsParam); 
0 голосов
/ 25 июня 2009

Я довольно часто использовал лямбды в качестве обработчиков событий, например:

button.Click += (sender, e) => DoSomething();

Мне кажется, что он создает очень чистый синтаксис, и иногда семантика замыкания может быть полезна для обработки событий.

0 голосов
/ 25 июня 2009

Спасибо, Джон,

Ваша функция Multi line очень хорошо принята

x => { текстовая строка = x.Value; int delimitedIndex = text.IndexOf (''); return int.Parse (text.Substring (0, delimitedIndex); }

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...