Приклади лямбда-виразів, які отримують параметрами масиви чисел, структури, класи

Приклади лямбда-виразів, які отримують параметрами масиви чисел, структури, класи

Дана тема базується на темі


Зміст


1. Приклад лямбда-виразу, який отримує параметром масив чисел

У даному прикладі оголошується лямбда-вираз, який обчислює середнє арифметичне в масиві цілих чисел.

Спочатку оголошується тип делегату

// Оголошення типу делегату
// Делегат отримує параметром масив цілих чисел
delegate double AverageArray(int[] A);

В іншому програмному коді (наприклад, обробнику події) лямбда-вираз програмується наступним чином:

// Обробник події кліку на кнопці
private void button1_Click(object sender, EventArgs e)
{
    // Оголошення лямбда-виразу, що отримує масив цілих чисел
    // Лямбда-вираз повертає середнє арифметичне в масиві A
    AverageArray AA = (int[] A) =>
    {
        // пошук середнього арифметичного значення в масиві A
        int i;
        double avg = 0;

        for (i = 0; i < A.Length; i++)
            avg += A[i];
        avg /= A.Length;
        return avg;
    };

    // Демонстрація використання лямбда-виразу AA
    // Оголошення масиву M
    int[] M = new int[5];

    // заповнення масиву M деякими значеннями
    for (int i = 0; i < M.Length; i++)
        M[i] = i * i;

    // виклик лямбда виразу
    double Avg;
    Avg = AA(M); // Avg = 6
}

 

2. Приклад лямбда-виразу, який отримує параметром структуру

У даному прикладі в класі оголошується структура типу BOOK. Потім оголошується тип делегату, що отримує структуру типу BOOK. В обробнику події button1_Click() оголошується лямбда-вираз, що виводить інформацію про вміст структури на форму. Інформація виводиться в елементи управління label1, label2, label3, label4 типу Label.

Весь програмний код модуля “Form1.cs”, що відповідає головній формі додатку.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TrainLyambda03
{
    public partial class Form1 : Form
    {
        // Оголошення структури в класі
        struct BOOK
        {
            public string title;
            public string author;
            public int year;
            public float price;
        };

        // Оголошення типу делегату, що отримує структуру типу BOOK
        // Делегат не отримує параметрів
        delegate void DisplayBOOK(BOOK B);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Лямбда-вираз, що отримує параметром структуру BOOK
            DisplayBOOK DB = (BOOK B) =>
            {
                // Вивід інформації про структуру на форму
                label1.Text = B.author;
                label2.Text = B.title;
                label3.Text = B.year.ToString();
                label4.Text = B.price.ToString();
            };

            // змінна типу структура
            BOOK BB;

            BB.author = "Author";
            BB.title = "Title of book";
            BB.year = 1539;
            BB.price = 0.01f;

            // виклик лямбда-виразу
            DB(BB);
        }
    }
}

 

3. Приклад лямбда-виразу, який отримує параметром масив структур

У даному прикладі продемонстровано передачу масиву структур в лямбда-вираз. Лямбда-вираз обчислює найбільшу відстань між двома точками, які збережені в масиві. Кожен елемент масиву є структура типу MyPoint, яка описує точку на координатній площині.
Програмний код модуля, створеного за шаблоном Windows Forms Application.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TrainLyambda06
{
    public partial class Form1 : Form
    {
        // Структура, що описує координати точки на площині
        struct MyPoint
        {
            int x;
            int y;

            public int GetX() { return x; }
            public int GetY() { return y; }

            public void SetPoint(int nx, int ny)
            {
                x = nx;
                y = ny;
            }
        };

        // Оголошення типу делегату, що отримує масив з 5 структур типу MyPoint
        delegate double CalcPoints(MyPoint[] P);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Оголошення змінної-делегату типу CalcPoints
            CalcPoints CP;

            // оголошення лямбда-виразу, що обчислює відстань між двома найбільш
            // віддаленими точками масиву структур M
            CP = (MyPoint[] M) =>
            {
                double x1, x2, y1, y2;
                double d, maxd;

                maxd = 0;
                for (int i=0; i<M.Length-1; i++)
                    for (int j = i+1; j < M.Length; j++)
                    {
                        x1 = M[i].GetX(); y1 = M[i].GetY();
                        x2 = M[j].GetX(); y2 = M[j].GetY();
                        d = Math.Sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
                        if (maxd < d) maxd = d;
                    }
                return maxd;
            };

            // Масив з 5 структур типу MyPoint
            MyPoint[] MP = new MyPoint[5];

            // ініціалізація полів структур деякими значеннями
            for (int i = 0; i < 5; i++)
                MP[i].SetPoint(i + 1, i * 2 + 3);

            // Демонстрація використання лямбда-виразу
            double D;
            D = CP(MP); // D = 8.944

            label1.Text = D.ToString();
        }
    }
}

 

4. Приклад лямбда-виразу, який отримує параметром клас

У даному прикладі оголошується лямбда-вираз, що виводить на екран форми координати точки екрану x, y. Лямбда-вираз отримує вхідним параметром клас типу MyClass1, який описує піксель на екрані монітору.



Передача класу в лямбда-вираз здійснюється так само як і передача структури. Нехай в окремому модулі оголошено клас MyClass1, який описує точку на екрані монітора.

// Текст модуля MyClass1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TrainLyambda07
{
    class MyClass1
    {
        int px;
        int py;
        int color;

        public int GetX() { return px; }
        public int GetY() { return py; }
        public int GetColor() { return color; }

        public void SetXYColor(int nx, int ny, int ncolor)
        {
            px = nx;
            py = ny;
            color = ncolor;
        }
    }
}

У модулі Form1.cs потрібно продемонструвати передачу класу в лямбда-вираз. Для цього спочатку оголошується тип делегату, що отримує вхідним параметром клас MyClass1.

// Оголосити тип делегату, що отримує вхідним параметром клас
delegate void ShowInfo(MyClass1 MC);

В іншому методі (наприклад, обробнику події) оголосити лямбда-вираз та викликати його.

private void button1_Click(object sender, EventArgs e)
{
    // Оголосити змінну-делегат типу ShowInfo та ініціалізувати її значенням лямбда-виразу
    ShowInfo SI = (MyClass1 MC) =>
    {
        // вивід на форму координат x, y
        label1.Text = MC.GetX().ToString();
        label2.Text = MC.GetY().ToString();
    };

    // демонстрація виклику лямбда-виразу
    MyClass1 MC1;
    MC1.SetXYColor(5, 6, 11);

    // вивід на форму координат з допомогою делегату
    SI(MC1);
}

 

5. Приклад лямбда-виразу, який отримує параметром масив класів

У даному прикладі в лямбда-вираз передається масив класів. Кожен клас реалізує точку (піксель) на екрані монітору Лямбда-вираз обчислює відстань між двома заданими точками масиву.
Нехай в окремому модулі MyClass1.cs оголошено клас MyClass1, що описує точку на екрані монітору.

// Текст модуля MyClass1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TrainLyambda07
{
    class MyClass1
    {
        int px;
        int py;
        int color;

        public int GetX() { return px; }
        public int GetY() { return py; }
        public int GetColor() { return color; }

        public void SetXYColor(int nx, int ny, int ncolor)
        {
            px = nx;
            py = ny;
            color = ncolor;
        }
    }
}

Оголошення типу делегату має вигляд:

// Оголошення типу делегату
delegate double CalcLength(MyClass1[] MC, int item1, int item2);

В обробнику події button1_Click() продемонстровано використання лямбда-виразу, що отримує вхідним параметром масив класів. Важливо тут звернути увагу на виділення пам’яті для кожного елементу масиву. При передачі масиву структур цього робити не потрібно, тому що структури зберігаються як типи-значення, а класи зберігаються як типи-посилання.

private void button1_Click(object sender, EventArgs e)
{
    // Оголосити змінну-делегат типу CalcLength
    CalcLength CL;

    // Реалізувати лямбда-вираз
    CL = (MC, item1, item2) =>
    {
        // вивід на форму координат x, y
        int x1, x2, y1, y2;
        double d;
        x1 = MC[item1].GetX();
        y1 = MC[item1].GetY();
        x2 = MC[item2].GetX();
        y2 = MC[item2].GetY();
        d = Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
        return d;
    };

    // демонстрація виклику лямбда-виразу
    MyClass1[] MC1 = new MyClass1[5]; // виділення пам'яті для масиву з 5 класів в цілому

    // виділення пам'яті для кожного елементу масиву - обов'язково для класів!!!
    for (int i = 0; i < MC1.Length; i++)
        MC1[i] = new MyClass1();

    // заповнення масиву MC1 довільними значеннями
    for (int i = 0; i < 5; i++)
        MC1[i].SetXYColor(2 * i, 3 * i + 4, i + 3);

    // виклик лямбда-виразу
    double length;
    length = CL(MC1, 2, 3); // length = 3.6055

    // вивід результату на форму
    label1.Text = length.ToString();
}

 


Зв’язані теми