вторник, 24 июня 2014 г.

О лямбда-выражениях

Лямбда-выражение — это сокращенный способ объявления простого анонимного метода

public class LambdaTest
{
       static void Main() {
       Func<int, double> expr = x => x / 2;
       int someNumber = 9;
       Console.WriteLine( "Результат: {0}", expr(someNumber) );
 }

            Func<int, int> expr = (x) =>
            {
                x = x * 10;
                MessageBox.Show(x.ToString());
                return x;
            };
            expr(1000);




Одиночные лямбда-выражения

параметр => выражение
(список_параметров) => выражение

(x, y) => x * y
Блочные лямбда-выражения
Для такого лямбда-выражения характерны расширенные возможности выполнения различных операций, поскольку в его теле допускается указывать несколько операторов.
(x, y) => { return x * y; }
using System;

namespace ConsoleApplication1
{
    // Создадим несколько делегатов имитирующих
    // простейшую форму регистрации
    delegate int LengthLogin (string s);
    delegate bool BoolPassword (string s1, string s2);
    delegate void Captha (string s1, string s2);

    class Program
    {
        static void Main()
        {
            link1:
            Console.Write("Введите логин: ");
            string login = Console.ReadLine();
            // Используем лямбда-выражение
            LengthLogin ll = ss => ss.Length;

            int longlogin = ll(login);
            if (longlogin >= 25)
            {
                Console.WriteLine("Слишком длинное имя\n");
                goto link1;
            }

            Console.Write("Введите пароль: ");
            string password1 = Console.ReadLine();
            Console.Write("Повторите пароль: ");
            string password2 = Console.ReadLine();

            // Используем лямбда выражение
            BoolPassword bp = (s1, s2) => s1 == s2;

            if (bp(password1, password2))
            {
                Random ran = new Random();
                string resCaptha = "";
                for (int i = 0; i < 10; i++)
                    resCaptha += (char)ran.Next(0, 100);
                Console.WriteLine("Введите код xD: "+resCaptha);
                string resCode = Console.ReadLine();

                // Реализуем блочное лямбда-выражение
                Captha cp = (s1,s2) =>
                {
                    if (s1 == s2)
                        Console.WriteLine("Регистрация удалась!");
                    else
                        Console.WriteLine("Не переживай, в следующий раз получится :)");
                    return;
                };
                cp(resCaptha, resCode);
            }
            else
                Console.WriteLine("Регистрация провалилась. Пароли не совпадают");

            Console.ReadLine();
        }
    }
}


using System;
using System.Linq;
using System.Collections.Generic;

public class LambdaTest
{
    static void Main() {
        var teamMembers = new List<string> {
            "Lou Loomis",
            "Smoke Porterhouse",
            "Danny Noonan",
            "Ty Webb"
        };

        FindByFirstName( teamMembers,
                         "Danny",
                         (x, y) => x.Contains(y) );
    }

    static void FindByFirstName(
                        List<string> members,
                        string firstName,
                        Func<string, string, bool> predicate ) {
        foreach( var member in members ) {
            if( predicate(member, firstName) ) {
                Console.WriteLine( member );
            }
        }
    }
}

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

public class EntryPoint
{
    static void Main() {
        Expression<Func<int, int>> expr = n => n+1;
        Func<int, int> func = expr.Compile();

        for( int i = 0; i < 10; ++i ) {
            Console.WriteLine( func(i) );
        }
    }
}

Анонимная рекурсия

Func<int, int> fact = null;
fact = (x) => x > 1 ? x * fact(x-1) : 1;
Замыкания в C# 2.0
using System;
public class LambdaTest
{
 static void Main() {
 int counter = 0;
 WriteStream( delegate () {
 return counter++;
 } );
 Console.WriteLine( "Финальное значение счетчика: {0}",
counter );
 }
 static void WriteStream( Func<int> counter ) {
 for( int i = 0; i < 10; ++i ) {
 Console.Write( "{0}, ", counter() );
 }
 Console.WriteLine();
 }

Комментариев нет:

Отправить комментарий