Wyrażenia lambda #1

by Piotrosz 21. December 2008
Wyrażenie lambda w C# to delegat bez nazwy (delegat anonimowy). Jest to operacja, bądź ciąg operacji bez nazwy. Lewa strona wyrażenia lambda to parametry (może ich w ogóle nie być). Po prawej stronie są zdefiniowane operacje. Obie strony są rozdzielone "=>". W podobny sposób definiuje się funkcję w matematyce i można to sobie z tym skojarzyć.
Na przykład: x => x*x to operacja podnoszenia do kwadratu. "x" jest w tym wyrażeniu zmienną wolną, tzn. jest tylko oznaczeniem i nie ma różnicy jaka litera czy słowo zostanie użyta/użyte. Taka definicja: cx => cx*cx jest dokładnie równoważna poprzedniej.
Pierwsze eksperymenty z wyrażeniami Lambda w C# 3.0:
using System;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace LINQ_4
{
  class Program
  {
    delegate double PodnoszenieDoKwadratu(double x);
    delegate double Mnozenie(double x, double y);
    delegate string ZwracanieStringa();

    static void Main(string[] args)
    {
      PodnoszenieDoKwadratu p = x => x * x;
      double Liczba = p(1.2d);
      Console.WriteLine(Liczba); // 1.44
          
      // Musi być nawias jak jest więcej niż 1 argument
      Mnozenie m = (x, y) => x * y;
      Liczba = m(2d, 3d);
      Console.WriteLine(Liczba); // 6

      // Wyrażenie Lambda bez parametrów.
      // Wyrażenie to jest ciągiem poleceń;
      ZwracanieStringa mc = () => { string s = "cześć"; return s; }; // to samo co: () => { "cześć" };
      string Slowo = mc();
      Console.WriteLine(Slowo); // cześć

      // Func to wbudowany delegat generyczny
      // Pierwszy parametr to argument, a drugi to zwracany typ
      Func EqualToA = x => x == "A";
      bool z = EqualToA("B");
      Console.WriteLine(z); // False

      // Wyrażenie Lambda może być argumentem metody!
      int[] Liczby = { 2, 3, 4, 5, 6, 9, 12 };
      // Count to metoda rozszerzająca, która jako argument przyjmuje predyktat (wyrażenie lambda)
      int IlePodzielnychPrzez3 = Liczby.Count(x => x % 3 == 0);
      Console.WriteLine(IlePodzielnychPrzez3); // 4

      int PierwszaPodzielnaPrzez3 = Liczby.First(x => x % 3 == 0);
      Console.WriteLine(PierwszaPodzielnaPrzez3); // 3

       bool CzySaWielokrotnosci4 = Liczby.Any(f => f % 4 == 0 && f != 4);
       Console.WriteLine(CzySaWielokrotnosci4); // True
    }
  }
}

Comments

4/17/2009 6:53:26 PM #

trackback

Trackback from dotnetomaniak.pl

Piotrosz | Wyrażenia lambda (w C# 3.0)

dotnetomaniak.pl

Comments are closed

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen