Elementor Header #8

44. Предикаты

1. Введение

Предикат — это функция, которая принимает один или несколько аргументов и возвращает true или false. В C# предикаты часто используются для фильтрации данных, проверки условий и работы с коллекциями.

В C# предикат можно представить:

  • Как метод (обычный bool-метод)
  • Как лямбда-выражение
  • Как делегат Predicate<T>

Пример предиката:

				
					bool IsEven(int number)
{
    return number % 2 == 0;
}

				
			

Вызов:

				
					Console.WriteLine(IsEven(4)); // true
Console.WriteLine(IsEven(7)); // false

				
			

2. Использование делегата Predicate<T>

C# предоставляет встроенный делегат Predicate<T>, который представляет метод, принимающий один аргумент типа T и возвращающий bool.

Пример:

				
					Predicate<int> isEven = num => num % 2 == 0;

Console.WriteLine(isEven(10)); // true
Console.WriteLine(isEven(11)); // false

				
			

Фактически, Predicate<T> — это сокращение для Func<T, bool>.


3. Использование предикатов с коллекциями

Методы коллекций, такие как List<T>.Find, FindAll, Exists, принимают предикаты.

Пример:

				
					List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };

// Найти первое четное число
int evenNumber = numbers.Find(num => num % 2 == 0);
Console.WriteLine(evenNumber); // 2

// Найти все четные числа
List<int> evenNumbers = numbers.FindAll(num => num % 2 == 0);
Console.WriteLine(string.Join(", ", evenNumbers)); // 2, 4, 6

// Проверить, есть ли числа больше 4
bool hasLargeNumbers = numbers.Exists(num => num > 4);
Console.WriteLine(hasLargeNumbers); // true

				
			

4. Передача предикатов в методы

Можно передавать предикаты как параметры методов.

Пример:

				
					bool CheckNumber(int number, Predicate<int> condition)
{
    return condition(number);
}

bool isPositive = CheckNumber(10, num => num > 0);
Console.WriteLine(isPositive); // true

				
			

5. Использование предикатов в LINQ

В LINQ предикаты применяются в методах Where, Any, All и других.

Пример:

				
					using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5 };

        var evenNumbers = numbers.Where(num => num % 2 == 0);
        Console.WriteLine(string.Join(", ", evenNumbers)); // 2, 4

        bool allPositive = numbers.All(num => num > 0);
        Console.WriteLine(allPositive); // true
    }
}

				
			

Заключение

  • Предикаты возвращают true или false и используются для проверки условий.
  • Predicate<T> — встроенный делегат C# для предикатов.
  • Часто применяются в методах List<T> и LINQ (Where, Any, All).
  • Предикаты могут передаваться в методы, улучшая читаемость кода.

Тестовое задание

Напишите программу, которая:

  1. Создаёт список чисел.
  2. Использует предикат, чтобы отфильтровать числа больше 10.
  3. Выводит отфильтрованный список.

Пример решения:

				
					using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 5, 12, 8, 20, 3, 15 };

        Predicate<int> isGreaterThanTen = num => num > 10;
        List<int> filteredNumbers = numbers.FindAll(isGreaterThanTen);

        Console.WriteLine("Числа больше 10: " + string.Join(", ", filteredNumbers));
    }
}

				
			

Попробуйте написать и запустить этот код, чтобы убедиться в правильности выполнения операций и особенностях работы с числами с плавающей точкой.

logo