Делаем мини-router команд на C#!
Нужно обработать набор текстовых команд без длинного switch? В этой задаче собираем простой router на Dictionary, который находит нужный обработчик и не зависит от регистра введённой команды.
В этой задаче:
Такой подход удобен для CLI-утилит, ботов, админских команд и внутренних инструментов, где набор действий постепенно растёт.
➡️ C# Ready | #задача
Нужно обработать набор текстовых команд без длинного switch? В этой задаче собираем простой router на Dictionary, который находит нужный обработчик и не зависит от регистра введённой команды.
В этой задаче:
• Храним команды в Dictionary;
• Ищем обработчик через TryGetValue;
• Запускаем нужное действие.
Такой подход удобен для CLI-утилит, ботов, админских команд и внутренних инструментов, где набор действий постепенно растёт.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤4👍3
Почему LINQ-запрос может выполниться несколько раз?
LINQ часто выглядит как готовая коллекция:
Но на самом деле Where() возвращает отложенный запрос. Он не выполняется в момент создания, а запускается каждый раз, когда результат начинают перебирать.
Например:
Если пройтись по active два раза, фильтрация тоже выполнится два раза:
Это может быть нормальным поведением для лёгких коллекций, но опасно, если внутри запрос к базе, чтение файла, сетевой вызов или дорогой расчёт.
Когда результат нужен именно как снимок данных, лучше материализовать его явно:
Теперь фильтрация выполнится один раз, а дальше код будет работать уже с готовым списком:
Если результат используется несколько раз, подумай, нужен ли тебе отложенный запрос или готовая коллекция через ToList().
➡️ C# Ready | #совет
LINQ часто выглядит как готовая коллекция:
var active = users.Where(u => u.IsActive);
Но на самом деле Where() возвращает отложенный запрос. Он не выполняется в момент создания, а запускается каждый раз, когда результат начинают перебирать.
Например:
var active = users.Where(u => {
Console.WriteLine(u.Name);
return u.IsActive;
});Если пройтись по active два раза, фильтрация тоже выполнится два раза:
foreach (var user in active) { }
foreach (var user in active) { }Это может быть нормальным поведением для лёгких коллекций, но опасно, если внутри запрос к базе, чтение файла, сетевой вызов или дорогой расчёт.
Когда результат нужен именно как снимок данных, лучше материализовать его явно:
var active = users
.Where(u => u.IsActive)
.ToList();
Теперь фильтрация выполнится один раз, а дальше код будет работать уже с готовым списком:
foreach (var user in active) { }
foreach (var user in active) { }Если результат используется несколько раз, подумай, нужен ли тебе отложенный запрос или готовая коллекция через ToList().
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤7🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Этот репозиторий представляет собой большую коллекцию реализаций алгоритмов и структур данных на языке C#. Здесь можно найти примеры сортировок, поиска, работы со строками, математических алгоритмов, графов, деревьев и других классических задач из программирования.
Оставляю ссылочку: GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤6🔥6
Напоминалка по delegates, events и базовым конструкциям C#!
Например, delegate описывает сигнатуру метода, а event позволяет подписывать обработчики на событие через типизированный делегат.
На картинке пример объявления delegate, регистрация методов, anonymous methods, события, популярные event handler-типы, а также рядом есть краткие блоки по классам, методам, struct, enum, свойствам и циклам.
Сохрани, чтобы не потерять!
➡️ C# Ready | #ресурс
Например, delegate описывает сигнатуру метода, а event позволяет подписывать обработчики на событие через типизированный делегат.
На картинке пример объявления delegate, регистрация методов, anonymous methods, события, популярные event handler-типы, а также рядом есть краткие блоки по классам, методам, struct, enum, свойствам и циклам.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤5🔥5
Делаем простой троттлинг действий в C#!
Иногда событие срабатывает слишком часто: ввод в поиске, resize окна, клики по кнопке или обновление фильтра. Чтобы не запускать тяжёлую операцию каждый раз, можно ограничить частоту выполнения.
Для начала создадим время последнего запуска:
И зададим минимальный интервал:
Теперь проверим, можно ли выполнять действие:
Когда действие реально выполняется, обновляем lastRun:
Но удобнее завернуть это в небольшой класс:
Использование получается простым:
Первый вызов выполнится, а второй сразу после него будет пропущен.
Такой троттлинг полезен там, где действие можно выполнять не чаще заданного интервала: отправка аналитики, обновление поиска, повторные клики или защита от слишком частых запросов.
➡️ C# Ready | #практика
Иногда событие срабатывает слишком часто: ввод в поиске, resize окна, клики по кнопке или обновление фильтра. Чтобы не запускать тяжёлую операцию каждый раз, можно ограничить частоту выполнения.
Для начала создадим время последнего запуска:
DateTimeOffset lastRun = DateTimeOffset.MinValue;
И зададим минимальный интервал:
TimeSpan interval = TimeSpan.FromSeconds(2);
Теперь проверим, можно ли выполнять действие:
bool CanRun()
{
return DateTimeOffset.UtcNow - lastRun >= interval;
}
Когда действие реально выполняется, обновляем lastRun:
if (CanRun())
{
lastRun = DateTimeOffset.UtcNow;
Console.WriteLine("search");
}
Но удобнее завернуть это в небольшой класс:
sealed class Throttler
{
private DateTimeOffset _lastRun = DateTimeOffset.MinValue;
private readonly TimeSpan _interval;
public Throttler(TimeSpan interval)
{
_interval = interval;
}
public bool TryRun(Action action)
{
var now = DateTimeOffset.UtcNow;
if (now - _lastRun < _interval)
{
return false;
}
_lastRun = now;
action();
return true;
}
}
Использование получается простым:
var throttler = new Throttler(TimeSpan.FromSeconds(2));
throttler.TryRun(() => Console.WriteLine("send request"));
throttler.TryRun(() => Console.WriteLine("send request"));
Первый вызов выполнится, а второй сразу после него будет пропущен.
Такой троттлинг полезен там, где действие можно выполнять не чаще заданного интервала: отправка аналитики, обновление поиска, повторные клики или защита от слишком частых запросов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤5👍2
Собираем валидатор пароля на C#!
Нужно проверить пароль и показать пользователю понятные причины отказа? Сделаем небольшой валидатор, где каждое правило отвечает за одну проверку и возвращает конкретную ошибку.
В этой задаче:
Такой подход удобнее одного большого if: правила проще расширять, тестировать и переиспользовать в разных частях приложения.
➡️ C# Ready | #совет
Нужно проверить пароль и показать пользователю понятные причины отказа? Сделаем небольшой валидатор, где каждое правило отвечает за одну проверку и возвращает конкретную ошибку.
В этой задаче:
• Описываем правила как функции;
• Проверяем длину, цифры, регистр и спецсимволы;
• Собираем все ошибки в один список.
Такой подход удобнее одного большого if: правила проще расширять, тестировать и переиспользовать в разных частях приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤8🔥3
Полезная статья про Avalonia и реализацию MVVM на C# по шагам!
В этой статье:
• Что такое Avalonia и почему она интересна для кроссплатформенного desktop
• Как разделить интерфейс и бизнес-логику через MVVM
• Как постепенно собрать пример приложения с View, ViewModel, binding и данными
➡️ C# Ready | #статья
В этой статье:
• Что такое Avalonia и почему она интересна для кроссплатформенного desktop
• Как разделить интерфейс и бизнес-логику через MVVM
• Как постепенно собрать пример приложения с View, ViewModel, binding и данными
Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤4🔥4👎1
Делаем простой rate limiter на C#!
Иногда нужно ограничить частоту действий: не давать пользователю слишком часто нажимать кнопку, вызывать команду или отправлять запрос
В этой задаче:
Такой подход легко расширить: можно поменять лимит, размер окна или хранить отдельную очередь для каждого пользователя.
➡️ C# Ready | #задача
Иногда нужно ограничить частоту действий: не давать пользователю слишком часто нажимать кнопку, вызывать команду или отправлять запрос
В этой задаче:
• храним timestamps последних вызовов;
• удаляем старые события;
• проверяем лимит в скользящем окне;
Такой подход легко расширить: можно поменять лимит, размер окна или хранить отдельную очередь для каждого пользователя.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍6🔥4
Разберём HttpClient: 7 возможностей для аккуратной работы с API!
HttpClient часто используют для интеграций, микросервисов и внешних HTTP-запросов. Чтобы код не превращался в ручную сборку строк, заголовков и JSON, стоит знать базовые возможности клиента.
В этой шпоре:
Эти вещи помогают писать API-клиенты короче, понятнее и устойчивее к зависаниям и ошибочным статусам.
➡️ C# Ready | #шпора
HttpClient часто используют для интеграций, микросервисов и внешних HTTP-запросов. Чтобы код не превращался в ручную сборку строк, заголовков и JSON, стоит знать базовые возможности клиента.
В этой шпоре:
• базовый адрес через BaseAddress;
• общие заголовки;
• GET-запросы;
Эти вещи помогают писать API-клиенты короче, понятнее и устойчивее к зависаниям и ошибочным статусам.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤5👍4