Лямбда-выражения C#: Почему я должен использовать их?

частные и защищенные модификаторы доступа являются одними и теми же, только защищенные члены базового класса могут быть доступны за пределами основного класса в дочернем (производном) классе. Это также относится к наследованию. Но с помощью частного модификатора члены базового класса могут быть доступны только в области или коде базового класса, а его функции-друзья - только '' ''

302
задан skia.heliou 27 April 2015 в 10:32
поделиться

10 ответов

Лямбда-выражения являются более простым синтаксисом для анонимных делегатов и могут использоваться везде может использоваться, анонимный делегат. Однако противоположное не верно; лямбда-выражения могут быть преобразованы в деревья выражений, который допускает большое волшебство как LINQ к SQL.

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

// anonymous delegate
var evens = Enumerable
                .Range(1, 100)
                .Where(delegate(int x) { return (x % 2) == 0; })
                .ToList();

// lambda expression
var evens = Enumerable
                .Range(1, 100)
                .Where(x => (x % 2) == 0)
                .ToList();

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

Деревья выражений являются очень мощной новой возможностью C# 3.0, которые позволяют API смотреть на структуру выражения вместо того, чтобы просто получить ссылку на метод, который может быть выполнен. API просто должен превратить параметр делегата в Expression<T>, параметр и компилятор генерируют дерево выражений от лямбды вместо анонимного делегата:

void Example(Predicate<int> aDelegate);

названный как:

Example(x => x > 5);

становится:

void Example(Expression<Predicate<int>> expressionTree);

последний будет передан представление абстрактное синтаксическое дерево , который описывает выражение x > 5. LINQ к SQL полагается на это поведение, чтобы быть в состоянии возвратить выражения C# к SQL-выражениям, желаемым для фильтрации / заказывающий / и т.д. на стороне сервера.

277
ответ дан Ted Johnson 23 November 2019 в 01:25
поделиться

Это - способ взять маленькую операцию и поместить его очень близко к тому, где это используется (мало чем отличающийся от объявления переменной близко к ее точке использования). Это, как предполагается, делает Ваш код более читаемым. Путем анонимизирования выражения Вы также делаете его намного тяжелее для кого-то для повреждения клиентского кода, если это функция используется где-то в другом месте и изменяется для "улучшения" его.

Точно так же, почему необходимо использовать foreach? Можно сделать все в foreach с плоскостью для цикла или просто использующий IEnumerable непосредственно. Ответ: Вы не делаете потребность это, но это делает Ваш код более читаемым.

3
ответ дан plinth 23 November 2019 в 01:25
поделиться

Лямбда-выражение является кратким способом представить анонимный метод. И анонимные методы и Лямбда-выражения позволяют Вам, определяют встроенную реализацию метода, однако, анонимный метод явно требует, чтобы Вы определили типы параметра и тип возврата для метода. Лямбда-выражение использует функцию вывода типа C# 3.0, который позволяет компилятору выводить тип переменной на основе контекста. It’s очень удобен, потому что это сохраняет нас большой ввод!

5
ответ дан Vijesh VP 23 November 2019 в 01:25
поделиться

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

4
ответ дан Darren Kopp 23 November 2019 в 01:25
поделиться

Это - всего один способ использовать лямбда-выражение. Можно использовать лямбда-выражение где угодно , можно использовать делегата. Это позволяет Вам делать вещи как это:

List<string> strings = new List<string>();
strings.Add("Good");
strings.Add("Morning")
strings.Add("Starshine");
strings.Add("The");
strings.Add("Earth");
strings.Add("says");
strings.Add("hello");

strings.Find(s => s == "hello");

Этот код будет искать список запись, которая распознает слово "привет". Другой способ сделать это должно на самом деле передать делегата в методе Находки, как это:

List<string> strings = new List<string>();
strings.Add("Good");
strings.Add("Morning")
strings.Add("Starshine");
strings.Add("The");
strings.Add("Earth");
strings.Add("says");
strings.Add("hello");

private static bool FindHello(String s)
{
    return s == "hello";
}

strings.Find(FindHello);

РЕДАКТИРОВАНИЕ :

В C# 2.0, это могло быть сделано с помощью анонимного синтаксиса делегата:

  strings.Find(delegate(String s) { return s == "hello"; });

Лямбда, значительно очищенная тот синтаксис.

29
ответ дан FlySwat 23 November 2019 в 01:25
поделиться

Microsoft дала нам инструмент для очистки, более удобный способ создать анонимных делегатов под названием Лямбда-выражения. Однако нет большого внимания, обращенного на эти выражения часть этого оператора. Microsoft выпустила все пространство имен, Система. Linq. Выражения , который содержит классы для создания деревьев выражений на основе лямбда-выражений. Деревья выражений составлены из объектов, которые представляют логику. Например, x = y + z является выражением, которое могло бы быть частью дерева выражений в.Net. Рассмотрите следующий (простой) пример:

using System;
using System.Linq;
using System.Linq.Expressions;


namespace ExpressionTreeThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            Expression<Func<int, int>> expr = (x) => x + 1; //this is not a delegate, but an object
            var del = expr.Compile(); //compiles the object to a CLR delegate, at runtime
            Console.WriteLine(del(5)); //we are just invoking a delegate at this point
            Console.ReadKey();
        }
    }
}

Этот пример тривиален. И я уверен, что Вы думаете, "Это бесполезно, поскольку я, возможно, непосредственно создал делегата вместо того, чтобы создать выражение и скомпилировать его во времени выполнения". И Вы были бы правы. Но это обеспечивает основу деревьев выражений. Существует много выражений, доступных в пространствах имен Выражений, и можно создать собственное. Я думаю, что Вы видите, что это могло бы быть полезно, когда Вы не знаете точно, чем алгоритм должен быть во время проектирования или время компиляции. Я видел пример где-нибудь для использования этого для записи научного калькулятора. Вы могли также использовать его для Байесовский системы, или для генетическое программирование (AI). Несколько раз в моей карьере я должен был записать подобную Excel функциональность что разрешенные пользователи для ввода простых выражений (дополнение, вычитания, и т.д.) для работы на доступные данные. В pre-.Net 3.5 я должен был обратиться к некоторому языку сценариев, внешнему к C#, или должен был использовать испускающую код функциональность в отражении для создания кода.Net на лету. Теперь я использовал бы деревья выражений.

22
ответ дан Thronk 23 November 2019 в 01:25
поделиться

Лямбда очистила C# 2.0's, анонимный синтаксис делегата..., например

Strings.Find(s => s == "hello");

был сделан в C# 2.0 как это:

Strings.Find(delegate(String s) { return s == "hello"; });

Функционально, они делают ту же самую вещь, ее просто намного более краткий синтаксис.

35
ответ дан Benjamin 23 November 2019 в 01:25
поделиться

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

private ComboBox combo;
private Label label;

public CreateControls()
{
    combo = new ComboBox();
    label = new Label();
    //some initializing code
    combo.SelectedIndexChanged += new EventHandler(combo_SelectedIndexChanged);
}

void combo_SelectedIndexChanged(object sender, EventArgs e)
{
    label.Text = combo.SelectedValue;
}

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

public CreateControls()
{
    ComboBox combo = new ComboBox();
    Label label = new Label();
    //some initializing code
    combo.SelectedIndexChanged += (s, e) => {label.Text = combo.SelectedValue;};
}

Намного легче.

84
ответ дан kmote 23 November 2019 в 01:25
поделиться

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

Рассматривают этот пример:

 string person = people.Find(person => person.Contains("Joe"));

по сравнению с

 public string FindPerson(string nameContains, List<string> persons)
 {
     foreach (string person in persons)
         if (person.Contains(nameContains))
             return person;
     return null;
 }

Они функционально эквивалентны.

135
ответ дан Community 23 November 2019 в 01:25
поделиться

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

И это не действительно инновации. LISP имел функции лямбды в течение приблизительно 30 лет или больше.

12
ответ дан workmad3 23 November 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: