Примеры лямбда-выражений, которые получают параметрами массивы чисел, структуры, классы

Примеры лямбда-выражений, которые получают параметрами массивы чисел, структуры, классы

Данная тема базируется на теме


Содержание



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() продемонстрировано использование лямбда-выражения, которое получает входным параметром массив классов. Важно здесь обратить внимание на выделение памяти для каждого элемента массива. При передаче массива структур этого делать не нужно, так как структуры сохраняются как тип-значение, а классы сохраняются как тип-ссылка. Поэтому, по этой ссылке должна выделяться память с помощью оператора new.

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();
}

 


Связанные темы