uk
Feedback

Не попадись на ботовода! Telemetrio знаходить і позначає такі канали мітками 👉 Хочеш бачити мітку, оформляй підписку

C# | Вопросы собесов

C# | Вопросы собесов

Відкрити в Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads

Показати більше
5 006
Підписники
+124 години
-97 днів
+530 днів
Архів дописів
🤔 Расскажи про метод ASP/Query? Не является стандартным термином в ASP.NET или ASP.NET Core. Возможно, имеется в виду подход к созданию запросов или API-методов в ASP.NET Core для обработки HTTP-запросов. Рассмотрим, как создавать и обрабатывать запросы в ASP.NET Core. 🚩Создание и Обработка Запросов 🟠Создание контроллера Контроллеры в ASP.NET Core отвечают за обработку HTTP-запросов и возврат ответов. Контроллеры обычно наследуются от класса ControllerBase или Controller.
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    private readonly IUserService _userService;

    public UsersController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpGet("{id}")]
    public IActionResult GetUser(int id)
    {
        var user = _userService.GetUserById(id);
        if (user == null)
        {
            return NotFound();
        }
        return Ok(user);
    }

    [HttpPost]
    public IActionResult CreateUser([FromBody] User user)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        _userService.CreateUser(user);
        return CreatedAtAction(nameof(GetUser), new { id = user.Id }, user);
    }
}
🟠Создание сервиса Сервисы содержат бизнес-логику приложения. Обычно они регистрируются в контейнере зависимостей.
public interface IUserService
{
    User GetUserById(int id);
    void CreateUser(User user);
}

public class UserService : IUserService
{
    private readonly List<User> _users = new List<User>();

    public User GetUserById(int id)
    {
        return _users.FirstOrDefault(u => u.Id == id);
    }

    public void CreateUser(User user)
    {
        user.Id = _users.Count + 1;
        _users.Add(user);
    }
}
🟠Модель данных Модель данных представляет структуру данных, с которой работает приложение.
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}
🟠Регистрация сервисов в контейнере зависимостей Регистрация сервисов в Startup.cs.
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddScoped<IUserService, UserService>();
}
🟠Настройка маршрутизации Настройка маршрутизации для контроллеров в Startup.cs.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
🚩Пример вызова API GET-запрос для получения пользователя
GET /api/users/1
POST-запрос для создания пользователя
POST /api/users
Content-Type: application/json

{
    "name": "Alice",
    "age": 30
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как используется ключевое слово await? Ключевое слово await используется для приостановки выполнения метода до завершения асинхронной задачи. Оно позволяет освобождать текущий поток и возвращается к коду после завершения задачи. await применяется в асинхронных методах, объявленных с помощью async. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как оптимизировать ситуацию, когда к таблице много join`ов? 🟠Индексы Создайте индексы на столбцах, используемых в условиях соединения (join).
CREATE INDEX idx_user_id ON Users(Id);
CREATE INDEX idx_order_user_id ON Orders(UserId);
🟠Избегайте ненужных полей Выбирайте только необходимые столбцы, чтобы уменьшить объем данных.
var query = from user in users
            join order in orders on user.Id equals order.UserId
            select new { user.Name, order.OrderId };
🟠Используйте отложенную загрузку (Lazy Loading) Отложенная загрузка загружает данные только тогда, когда они действительно нужны.
var user = context.Users.Find(userId);
context.Entry(user).Collection(u => u.Orders).Load();
🟠Разделение на подзапросы Разделите сложные запросы на подзапросы для улучшения читаемости и производительности.
var userIds = users.Select(u => u.Id).ToList();
var query = from order in orders
            where userIds.Contains(order.UserId)
            select order;
🟠Применяйте фильтрацию до join Фильтруйте данные перед выполнением join, чтобы уменьшить размер соединяемых таблиц.
var filteredUsers = users.Where(u => u.IsActive);
var query = from user in filteredUsers
            join order in orders on user.Id equals order.UserId
            select new { user.Name, order.OrderId };
🟠Используйте оптимизированные ORM функции Используйте функции ORM, которые могут генерировать более оптимизированные SQL-запросы.
var query = context.Users
    .Where(u => u.IsActive)
    .SelectMany(u => u.Orders, (user, order) => new { user.Name, order.OrderId });
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чем разница между асинхронностью и многопоточностью? Асинхронность позволяет выполнять задачи без блокировки основного потока, в то время как многопоточность предполагает разделение кода на несколько потоков. Асинхронные операции выполняются в том же потоке, но не блокируют его, а многопоточность использует параллельные потоки для выполнения задач одновременно.\ Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Сообщество IT-специалистов в Telegram от Selectel. Канал крупнейшего независимого провайдера IT-инфраструктуры и облаков. Шес
Сообщество IT-специалистов в Telegram от Selectel. Канал крупнейшего независимого провайдера IT-инфраструктуры и облаков. Шесть причин подписаться на канал: - железные новости; - обзоры продуктов; - разборы кейсов; - актуальные IT-статьи; - анонсы митапов; - бесплатные курсы. Подписаться #реклама О рекламодателе

🤔 Как работают join`ы? join в LINQ используется для объединения двух последовательностей на основе соответствия ключей. Вот краткие примеры, показывающие, как работают join в LINQ. 🚩Основные типы 🟠Inner Join Соединяет элементы двух коллекций, если их ключи совпадают.
var query = from user in users
            join order in orders on user.Id equals order.UserId
            select new { user.Name, order.OrderId };
🟠Group Join Создает группы элементов из второй коллекции, соответствующие каждому элементу из первой коллекции.
var query = from user in users
            join order in orders on user.Id equals order.UserId into userOrders
            select new { user.Name, Orders = userOrders };
🟠Left Join (нет прямой поддержки, можно имитировать с помощью DefaultIfEmpty) Возвращает все элементы из первой коллекции и соответствующие элементы из второй коллекции, если они существуют.
var query = from user in users
            join order in orders on user.Id equals order.UserId into userOrders
            from order in userOrders.DefaultIfEmpty()
            select new { user.Name, OrderId = order?.OrderId };
🚩Примеры Данных
var users = new List<User>
{
    new User { Id = 1, Name = "Alice" },
    new User { Id = 2, Name = "Bob" }
};

var orders = new List<Order>
{
    new Order { OrderId = 101, UserId = 1 },
    new Order { OrderId = 102, UserId = 1 },
    new Order { OrderId = 103, UserId = 2 }
};
Inner Join
var query = from user in users
            join order in orders on user.Id equals order.UserId
            select new { user.Name, order.OrderId };

foreach (var item in query)
{
    Console.WriteLine($"{item.Name} - {item.OrderId}");
}
Group Join
var query = from user in users
            join order in orders on user.Id equals order.UserId into userOrders
            select new { user.Name, Orders = userOrders };

foreach (var item in query)
{
    Console.WriteLine($"{item.Name} has {item.Orders.Count()} orders");
}
Left Join
var query = from user in users
            join order in orders on user.Id equals order.UserId into userOrders
            from order in userOrders.DefaultIfEmpty()
            select new { user.Name, OrderId = order?.OrderId };

foreach (var item in query)
{
    Console.WriteLine($"{item.Name} - {item.OrderId}");
}
Ставь 👍 и забирай 📚 Базу знаний

э

🤔 Что такое EF? EF (Entity Framework) — это ORM (Object-Relational Mapping) для .NET, облегчающая работу с базами данных. С помощью EF разработчики могут манипулировать данными как объектами C# без необходимости писать SQL-код. Он автоматически преобразует объекты в SQL-запросы и обратно. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Получите грант на обучение в Центральном университете Прояви себя, получи грант до 2,8 млн на обучение ИТ и бизнесу в вузе. Для школьников 10-х и 11-х классов, СПО. Подать заявку #реклама apply.centraluniversity.ru О рекламодателе

🤔 Где используется IQueryable? IQueryable используется для работы с данными в LINQ (Language Integrated Query) и позволяет создавать запросы, которые могут быть выполнены в различных источниках данных, таких как базы данных, XML-документы, коллекции объектов и другие. IQueryable поддерживает отложенное выполнение (deferred execution) запросов и предоставляет возможности для построения сложных запросов, которые могут быть оптимизированы и преобразованы в соответствующий язык запросов, например, SQL для работы с базами данных. 🚩Основные сценарии 🟠LINQ to SQL и Entity Framework Одним из наиболее распространенных примеров использования IQueryable является работа с базами данных через ORM, такие как LINQ to SQL и Entity Framework. IQueryable позволяет создавать запросы, которые преобразуются в SQL-запросы и выполняются в базе данных.
using (var context = new MyDbContext())
{
    IQueryable<User> usersQuery = context.Users.Where(u => u.Age > 30);

    foreach (var user in usersQuery)
    {
        Console.WriteLine(user.Name);
    }
}
🟠Отложенное выполнение (Deferred Execution) Запросы, построенные с использованием IQueryable, выполняются только при их итерации (например, с помощью foreach) или при вызове методов, таких как ToList(), First(), Single(), Count() и т.д. Это позволяет строить запросы динамически, добавляя условия в зависимости от логики приложения.
IQueryable<User> usersQuery = context.Users;

if (includeInactive)
{
    usersQuery = usersQuery.Where(u => !u.IsActive);
}

List<User> users = usersQuery.ToList();
🟠Поддержка сложных запросов IQueryable позволяет создавать сложные запросы, включающие фильтрацию, сортировку, группировку и объединение данных.
var query = from user in context.Users
            where user.Age > 30
            orderby user.Name
            select new { user.Name, user.Age };

foreach (var user in query)
{
    Console.WriteLine($"{user.Name}, {user.Age}");
}
🟠Провайдеры LINQ IQueryable часто используется провайдерами LINQ, которые могут преобразовывать выражения LINQ в специфичные для источника данных команды. Например, провайдер Entity Framework преобразует выражения LINQ в SQL-запросы.
public class MyCustomProvider : IQueryProvider
{
    public IQueryable CreateQuery(Expression expression)
    {
        return new MyCustomQueryable(expression);
    }

    public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
    {
        return new MyCustomQueryable<TElement>(expression);
    }

    public object Execute(Expression expression)
    {
        // Логика выполнения запроса
    }

    public TResult Execute<TResult>(Expression expression)
    {
        // Логика выполнения запроса
    }
}
🚩Примеры использования Фильтрация и сортировка
using (var context = new MyDbContext())
{
    IQueryable<User> query = context.Users
        .Where(u => u.Age > 30)
        .OrderBy(u => u.Name);

    foreach (var user in query)
    {
        Console.WriteLine($"{user.Name}, {user.Age}");
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое asp.net ASP.NET — это веб-платформа от Microsoft для создания динамических сайтов и веб-приложений. Она работает на базе .NET Framework, предоставляя разработчикам доступ к широкому набору инструментов и библиотек. ASP.NET поддерживает множество языков программирования, включая C# и VB.NET, что делает её универсальной для различных задач. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Как мы делаем СУБД Pangolin? Привет! На связи команда разработки СУБД Platform V Pangolin. Мы делаем полезное сообщество для
Как мы делаем СУБД Pangolin? Привет! На связи команда разработки СУБД Platform V Pangolin. Мы делаем полезное сообщество для всех профессионалов из мира СУБД и всех, кому интересен наш продукт. Пишем о том, как делаем Pangolin, разбираем ваши кейсы в чате, помогаем решать рабочие задачки, зовем на бесплатные вебинары и митапы, проводим квизы про базы данных, разбираем английский сленг, а еще у нас есть вакансии и идеи для хобби айтишников... Подпишитесь, у нас как раз много нового! Подписаться #реклама 16+ О рекламодателе

🤔 Что такое expression? Это структура данных, представляющая код в виде дерева. Деревья выражений позволяют программно строить, анализировать и выполнять код. Это мощный инструмент для динамического создания и трансформации выражений, что делает их полезными в различных сценариях, таких как LINQ, ORM (например, Entity Framework), динамическое построение запросов и создание компилируемых делегатов. 🚩Основные концепции 🟠Expression Tree (дерево выражений) Это структура данных, которая представляет синтаксическое дерево кода. Каждая нода (узел) дерева является экземпляром класса Expression или его производных. 🟠System.Linq.Expressions Пространство имен, в котором находятся классы и методы для работы с деревьями выражений. 🚩Пример создания Простое арифметическое выражение
using System;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        // Создаем параметры для выражения
        ParameterExpression paramA = Expression.Parameter(typeof(int), "a");
        ParameterExpression paramB = Expression.Parameter(typeof(int), "b");

        // Создаем выражение: a + b
        BinaryExpression body = Expression.Add(paramA, paramB);

        // Компилируем выражение в делегат
        var add = Expression.Lambda<Func<int, int, int>>(body, paramA, paramB).Compile();

        // Используем делегат
        int result = add(2, 3);
        Console.WriteLine(result); // Output: 5
    }
}
🚩Сценарии использования expression 🟠LINQ to SQL и другие ORM Деревья выражений широко используются в ORM системах для преобразования выражений LINQ в SQL-запросы. Это позволяет использовать LINQ-запросы для взаимодействия с базами данных.
using (var context = new MyDbContext())
{
    var query = context.Users.Where(u => u.Age > 30);
    // Выражение `u => u.Age > 30` представлено как Expression и переводится в SQL
    foreach (var user in query)
    {
        Console.WriteLine(user.Name);
    }
}
🟠Динамическое построение запросов Деревья выражений позволяют создавать динамические запросы, которые могут изменяться в зависимости от условий во время выполнения программы.
public static IQueryable<T> ApplyFilter<T>(IQueryable<T> query, string propertyName, object value)
{
    var parameter = Expression.Parameter(typeof(T), "x");
    var member = Expression.Property(parameter, propertyName);
    var constant = Expression.Constant(value);
    var body = Expression.Equal(member, constant);
    var predicate = Expression.Lambda<Func<T, bool>>(body, parameter);
    
    return query.Where(predicate);
}
🟠Построение компилируемых делегатов Деревья выражений можно использовать для создания делегатов, которые компилируются во время выполнения, что позволяет динамически генерировать и выполнять код.
Expression<Func<int, int, int>> expr = (a, b) => a + b;
var func = expr.Compile();
int result = func(2, 3); // result = 5
Ставь 👍 и забирай 📚 Базу знаний

Repost from Идущий к IT
Твое резюме на HeadHunter — ОК, если ты видишь это. HeadHunter сравнивает ключевые навыки в твоем резюме и в вакансии и в мом
Твое резюме на HeadHunter — ОК, если ты видишь это. HeadHunter сравнивает ключевые навыки в твоем резюме и в вакансии и в момент отклика отображает, насколько % ты соответствуешь требованиям. Специальный бейджик «Подходит по навыкам на 100%» отображается, если соответствие составляет более 60%. Если при просмотре вакансий ты видишь такой бейджик, это значит, что список навыков в твоем резюме качественно составлен. Это важный параметр, так как рекрутерам чаще показываются резюме с лучшим соответствием. О том, как правильно указывать ключевые навыки и оптимизировать свое резюме я уже рассказывал в этом видео

🤔 Что такое сервис локатор? Сервис локатор — это шаблон проектирования, который используется в программировании для управления зависимостями между классами. Он действует как централизованный реестр, который хранит экземпляры сервисов и предоставляет их по запросу. В C# этот шаблон помогает избежать жесткой связи между компонентами программы, облегчая тестирование и поддержку. 1. Централизованное управление: Сервис локатор держит реестр всех доступных сервисов и предоставляет их по запросу, что упрощает управление жизненным циклом объектов. 2. Гибкость: Шаблон позволяет легко заменять и обновлять сервисы без изменения кода, который их использует, что делает приложение более модульным. 3. Изоляция зависимостей: С помощью сервис локатора, компоненты могут запрашивать зависимости в рантайме, что снижает зависимость от конкретных реализаций. Однако стоит учитывать, что чрезмерное использование сервис локатора может привести к скрытому управлению зависимостями, что усложняет отслеживание и управление ими в больших приложениях. Это может сделать архитектуру приложения менее прозрачной и затруднить отладку и тестирование. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Как экономить с Low-code от СберТеха 5 декабря в 11:00 приглашаем на бесплатный вебинар «Полный цикл low-code разработки под
Как экономить с Low-code от СберТеха 5 декабря в 11:00 приглашаем на бесплатный вебинар «Полный цикл low-code разработки под ключ: от базы данных до бизнес-процессов» от СберТеха. Поделимся реальным опытом low-code разработки. Разберем кейсы для банковского, финтех-сегментов и не только. Покажем в реальном времени возможности продуктов Platform V Flow и Platform V DataSpace для low-code разработки. Расскажем о лучших практиках использования low-code инструментов. А еще вы узнаете: ✅ Как решения, созданные с использованием low-code инструментов, выдерживают highload-нагрузки ✅ Как сэкономить ресурсы senior-разработчиков ✅ Как быстро и дешево создать прототип готового решения / enterprise-grade бэкенда приложений Регистрируйтесь и приходите! Зарегистрироваться #реклама 16+ platformv.sbertech.ru О рекламодателе

🤔 Для чего используются expression`ы? Для представления кода в виде структур данных, что позволяет программно создавать, анализировать и выполнять этот код. Это дает мощные возможности для динамической работы с кодом, включая создание, трансформацию и выполнение выражений во время выполнения программы. 🚩Основные сценарии 🟠LINQ to SQL и другие ORM Expression`ы широко используются в ORM (Object-Relational Mapping) системах, таких как Entity Framework и LINQ to SQL, для преобразования выражений LINQ в SQL-запросы.
using (var context = new MyDbContext())
{
    var query = context.Users.Where(u => u.Age > 30);
    // Выражение `u => u.Age > 30` представлено как Expression и переводится в SQL
    foreach (var user in query)
    {
        Console.WriteLine(user.Name);
    }
}
🟠Динамическое построение запросов Expression`ы позволяют создавать динамические запросы, которые могут изменяться в зависимости от условий во время выполнения программы.
public static IQueryable<T> ApplyFilter<T>(IQueryable<T> query, string propertyName, object value)
{
    var parameter = Expression.Parameter(typeof(T), "x");
    var member = Expression.Property(parameter, propertyName);
    var constant = Expression.Constant(value);
    var body = Expression.Equal(member, constant);
    var predicate = Expression.Lambda<Func<T, bool>>(body, parameter);
    
    return query.Where(predicate);
}
🟠Построение компилируемых делегатов Expression`ы можно использовать для создания делегатов, которые компилируются во время выполнения, что позволяет динамически генерировать и выполнять код.
Expression<Func<int, int, int>> expr = (a, b) => a + b;
var func = expr.Compile();
int result = func(2, 3); // result = 5
🟠Анализ и трансформация кода Expression`ы позволяют анализировать и изменять выражения, что полезно для создания библиотек и фреймворков, которые работают с выражениями.
Expression<Func<int, bool>> expr = x => x > 5;
var body = (BinaryExpression)expr.Body;
var left = (ParameterExpression)body.Left;
var right = (ConstantExpression)body.Right;
Console.WriteLine($"Left: {left.Name}, Right: {right.Value}"); // Output: Left: x, Right: 5
🟠Валидация и динамическая генерация правил Expression`ы могут быть использованы для создания динамических правил валидации и их проверки.
public static Func<T, bool> GetValidator<T>(string propertyName, object value)
{
    var parameter = Expression.Parameter(typeof(T), "x");
    var member = Expression.Property(parameter, propertyName);
    var constant = Expression.Constant(value);
    var body = Expression.Equal(member, constant);
    return Expression.Lambda<Func<T, bool>>(body, parameter).Compile();
}

var validateAge = GetValidator<User>("Age", 30);
bool isValid = validateAge(new User { Age = 30 }); // isValid = true
🟠Кэширование и оптимизация Expression`ы могут быть использованы для создания кэша выражений, что позволяет оптимизировать выполнение часто повторяющихся операций.
var parameter = Expression.Parameter(typeof(int), "x");
var body = Expression.Multiply(parameter, Expression.Constant(2));
var lambda = Expression.Lambda<Func<int, int>>(body, parameter);
var compiled = lambda.Compile();

// Кэшируем делегат
var cache = new Dictionary<int, Func<int, int>>();
cache[2] = compiled;

int result = cache ; // result = 6
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как используется ключевое слово await? В C#, ключевое слово `await` используется в сочетании с асинхронными методами для указания точки, в которой выполнение текущего метода будет приостановлено до завершения асинхронной операции. `await` делает код асинхронной операции выглядящим как синхронный и позволяет возвращать управление вызывающему коду, предотвращая блокировку UI или других операций, пока асинхронная операция выполняется. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Помощь в трудоустройстве в IT-сфере! В России из-за дефицита айтишников запустили бесплатную программу по обучению IT-специал
+9
Помощь в трудоустройстве в IT-сфере! В России из-за дефицита айтишников запустили бесплатную программу по обучению IT-специалистов. Теперь любой желающий может попробовать себя в IT с полного нуля и начать обучение бесплатно! Узнайте про дальнейшее трудоустройство в ведущие IT-компании для восполнения кадрового дефицита. Для этого нужно: - Перейти по ссылке - Заполнить анкету и ответить на вопросы (занимает менее 3 минут) - На основании ваших ответов вы сразу узнаете, подходит ли вам сфера IT и сможете ли вы в ней работать Перейти на сайт #реклама 16+ urban-university.ru О рекламодателе

🤔 Что такое деревья выражений? Представляют собой мощный инструмент для работы с кодом на уровне его синтаксического дерева. Они позволяют программно строить, анализировать и выполнять выражения, представленные в виде дерева объектов. 🚩Понятия 🟠Определение Деревья выражений — это структура данных, которая представляет собой синтаксическое дерево выражения. Они позволяют рассматривать и манипулировать кодом как данными. 🟠Пространство имен Деревья выражений находятся в пространстве имен System.Linq.Expressions. 🚩Зачем нужны? 🟠Динамическое создание кода Позволяют создавать и компилировать код во время выполнения. 🟠Анализ выражений Полезны для инструментов анализа кода, таких как ORM (например, Entity Framework), которые преобразуют выражения LINQ в SQL-запросы. 🟠Рефлексия Помогают в сценариях, где нужно исследовать и манипулировать кодом на уровне метаданных. Простое арифметическое выражение
using System;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        // Создаем параметры для выражения
        ParameterExpression paramA = Expression.Parameter(typeof(int), "a");
        ParameterExpression paramB = Expression.Parameter(typeof(int), "b");

        // Создаем выражение: a + b
        BinaryExpression body = Expression.Add(paramA, paramB);

        // Компилируем выражение в делегат
        var add = Expression.Lambda<Func<int, int, int>>(body, paramA, paramB).Compile();

        // Используем делегат
        int result = add(2, 3);
        Console.WriteLine(result); // Output: 5
    }
}
Выражение с логикой
using System;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        // Создаем параметры для выражения
        ParameterExpression paramX = Expression.Parameter(typeof(int), "x");
        ParameterExpression paramY = Expression.Parameter(typeof(int), "y");

        // Создаем выражение: x > y ? x - y : y - x
        Expression condition = Expression.Condition(
            Expression.GreaterThan(paramX, paramY),
            Expression.Subtract(paramX, paramY),
            Expression.Subtract(paramY, paramX)
        );

        // Компилируем выражение в делегат
        var compareAndSubtract = Expression.Lambda<Func<int, int, int>>(condition, paramX, paramY).Compile();

        // Используем делегат
        int result1 = compareAndSubtract(10, 5); // Output: 5
        int result2 = compareAndSubtract(3, 8);  // Output: 5

        Console.WriteLine(result1);
        Console.WriteLine(result2);
    }
}
🚩Использование деревьев выражений Одним из наиболее распространенных примеров использования деревьев выражений является LINQ. Когда вы пишете выражения LINQ, такие как Queryable.Where, они часто переводятся в деревья выражений, которые затем могут быть преобразованы в SQL-запросы или другие форматы.
using System;
using System.Linq;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        Expression<Func<int, bool>> expr = x => x > 5;

        // Разбор дерева выражений
        var body = (BinaryExpression)expr.Body;
        var left = (ParameterExpression)body.Left;
        var right = (ConstantExpression)body.Right;

        Console.WriteLine($"Left: {left.Name}, Right: {right.Value}"); // Output: Left: x, Right: 5
    }
}
Ставь 👍 и забирай 📚 Базу знаний