Приклади лямбда-виразів, які отримують параметрами масиви чисел, структури, класи
Дана тема базується на темі
Зміст
- Питання
- 1. Приклад лямбда-виразу, який отримує параметром масив чисел
- 2. Приклад лямбда-виразу, який отримує параметром структуру
- 3. Приклад лямбда-виразу, який отримує параметром масив структур
- 4. Приклад лямбда-виразу, який отримує параметром клас
- 5. Приклад лямбда-виразу, який отримує параметром масив класів
- Зв’язані теми
Пошук на інших ресурсах:
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(); }
⇑
Зв’язані теми
- Загальні поняття про лямбда-вирази. Лямбда-оператор. Одиночні та блочні лямбда-вирази
- Анонімні функції. Анонімні методи. Повернення значення. Передача параметрів
- Поняття делегату. Оголошення типу делегату. Використання делегатів у програмі. Групове перетворення методів
- Приклади використання анонімного методу та лямбда-виразу в якості події. Обробники подій, що використовуються в середовищі .NET