9818
Авторский канал по разработке на C# и Unity. Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_it РКН: https://clck.ru/3SBaT3 Реклама на бирже: https://telega.in/c/csharp_ready
👩💻 Сортируем LINQ без сюрпризов!В этой шпаргалке — понятная разница между обычной и вторичной сортировкой, когда уместен Reverse(), и как задавать свой порядок сравнения без лишней путаницы.
➡️ C# Ready | #шпора
☕️ CodeAbbey — тренажёр алгоритмического мышления!
Сайт с огромной коллекцией задач по программированию, от самых простых до тех, что реально заставят подумать.
Учиться можно на абсолютно любом языке. Отличный способ подтянуть логику, научиться писать аккуратный код и подготовиться к собесам.
📌 Оставляю ссылочку: codeabbey.com
➡️ C# Ready | #ресурс
Прогресс-бар в консоли для долгих операций — наглядный прогресс без UI!
Когда операция выполняется несколько секунд (или минут), пустая консоль выглядит как зависшая. Проще сразу показывать прогресс — например, в виде текстового прогресс-бара.
Нам хватит стандартных пространств имён:
using System;
using System.Threading;
Thread.Sleep и обновлять строку прогресса:int total = 100;
for (int i = 0; i <= total; i++)
{
DrawProgressBar(i, total);
Thread.Sleep(50); // имитация долгой работы
}
Console.WriteLine();
Console.WriteLine("Готово!");
DrawProgressBar: он считает процент, строит строку вида [#####-----] 50% и перерисовывает одну и ту же строку в консоли:static void DrawProgressBar(int current, int total)
{
int width = 30; // ширина прогресс-бара в символах
double progress = (double)current / total;
int filled = (int)(progress * width);
string bar = new string('#', filled) + new string('-', width - filled);
Console.Write($"\r[{bar}] {progress:P0}");
}
\r в начале строки:[###############---------------] 50%
Готово!.\r, тогда консоль не превратится в простыню из сотен сообщений.
☕️ ByteHide Blog — C# Clean Code & Tips!
Блог про C# и .NET с упором на чистый и поддерживаемый код: практичные гайды, подборки сниппетов, разбор современных фич (C# 12, .NET 10, атрибуты, паттерны), плюс статьи для прокачки от уровня новичка до мидла.
📌 Оставляю ссылочку: bytehide.com
➡️ C# Ready | #ресурс
👩💻 IEnumerable vs IQueryable без путаницы!В этой шпаргалке разбираемся, чем отличается работа LINQ по уже загруженным коллекциям от “живых” запросов к базе: где на самом деле исполняется код, как влияет отложенное выполнение и материализация
➡️ C# Ready | #шпора
Перестаём плодить new HttpClient() с IHttpClientFactory!
Частая ошибка: в каждом методе делать new HttpClient(). В итоге — утечки сокетов, странные таймауты и боль в проде. В .NET есть нормальный способ — IHttpClientFactory.
Сначала регистрируем фабрику и настраиваем клиент в DI:
using System;
using System.Net.Http;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
services.AddHttpClient("github", client =>
{
client.BaseAddress = new Uri("https://api.github.com/");
client.DefaultRequestHeaders.UserAgent.ParseAdd("CSharpReadySample");
});
var provider = services.BuildServiceProvider();
IHttpClientFactory и берём настроенный клиент по имени:var factory = provider.GetRequiredService<IHttpClientFactory>();
using var client = factory.CreateClient("github");
var response = await client.GetAsync("repos/dotnet/runtime");
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content[..200] + "...");
new HttpClient() используйте один IHttpClientFactory: настроили клиент в одном месте, берёте его из DI где нужно — без утечек и с предсказуемым поведением в проде.
📱 Корутины: сценарии времени без хаоса!
Когда события завязаны на время, удобнее описывать поведение как последовательность шагов с паузами, чем вручную крутить таймеры и внутренние флаги.
Коротко о корутинах:
• Помогают вынести ожидания и задержки из игрового цикла;
• Делают последовательные события читаемыми, как сценарий или раскадровка;
• Упрощают отладку странных зависаний, редких триггеров и переходов.
👩💻 Регулярки без магии и боли!В этой шпаргалке — базовые приёмы работы с Regex: как быстро проверять строки на соответствие шаблону, вытаскивать нужные куски, массово очищать и разбивать текст, а ещё безопасно экранировать пользовательский ввод
➡️ C# Ready | #шпора
Удобный System.Text.Json в .NET 8 без Newtonsoft!
Во многих проектах до сих пор тянут Newtonsoft.Json только ради пары фич. В .NET 8 стандартный System.Text.Json уже закрывает большинство кейсов.
Сначала настраиваем опции сериализации и включаем snake_case:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
var options = new JsonSerializerOptions
{
// Имена свойств в JSON будут в snake_case
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
// Красивый формат для логов/отладки
WriteIndented = true
};
// Включаем полиморфную сериализацию по интерфейсу
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")]
[JsonDerivedType(typeof(CreateUserCommand), typeDiscriminator: "create")]
[JsonDerivedType(typeof(DeleteUserCommand), typeDiscriminator: "delete")]
public interface ICommand { }
public record CreateUserCommand(string UserName) : ICommand;
public record DeleteUserCommand(Guid UserId) : ICommand;
JSON и восстанавливаем обратно в интерфейс:// Работаем через интерфейс — внутри может быть любая команда
ICommand cmd = new CreateUserCommand("test_user");
// Сериализация с нашими настройками
var json = JsonSerializer.Serialize(cmd, options);
Console.WriteLine(json);
// Десериализация обратно в ICommand
var restored = JsonSerializer.Deserialize<ICommand>(json, options);
System.Text.Json уже умеет удобный snake_case и полиморфную сериализацию по интерфейсам, так что во многих сервисах можно спокойно обходиться без Newtonsoft.
Как создавать коллекции без десятка Add?
Во многих местах сначала создаём коллекцию, а потом построчно заполняем её — кода получается больше, чем самих данных:
var ids = new List<int>();
ids.Add(1);
ids.Add(2);
ids.Add(3);
var byId = new Dictionary<int, string>();
byId.Add(1, "Alice");
byId.Add(2, "Bob");
var ids = new List<int> { 1, 2, 3 };
var byId = new Dictionary<int, string>
{
[1] = "Alice",
[2] = "Bob"
};
Как сократить цепочки if/else по статусам?
Во многих проектах бизнес-логика по статусам размазана по коду длинными цепочками if/else: для каждого нового состояния появляется ещё один блок, читать и поддерживать это всё становится всё сложнее
Классический вариант быстро разрастается:
string text;
if (status == OrderStatus.New)
text = "Новый заказ";
else if (status == OrderStatus.Paid)
text = "Заказ оплачен";
else
text = "Неизвестный статус";
switch-expression делает то же самое компактным выражением:var text = status switch
{
OrderStatus.New => "Новый заказ",
OrderStatus.Paid => "Заказ оплачен",
_ => "Неизвестный статус"
};
default. enum → текст, выбора цвета, типа уведомления или уровня логирования.
📱 UI Events: гибкое управление интерфейсом!
Когда кнопки перестают напрямую ссылаться на игровую логику, интерфейс становится легче перестраивать и переносить между сценами.
В этом посте разбираем:
• События освобождают UI от лишних связей и настроек;
• Логика реагирует гибко и не зависит от конкретных экранов;
• Проект выдерживает изменения без поломок и переработок
👩💻 Считаем повседневные расходы в консоли!
Берём несколько строк с тратами, превращаем их в структуру и заставляем программу показать, какая категория незаметно съедает большую часть бюджета.
В этой задаче:
• Соберёшь простой отчёт о тратах прямо в консоли;
• Увидишь, на какие категории уходит больше всего денег;
• Почувствуешь, как сухие числа превращаются в понятную картину дня.
📱 Секрет хронологии скриптов для стабильности!
Едва заметное смещение порядка запуска скриптов способно породить загадочные баги, поэтому раз и навсегда стоит приручить их хронометраж в своём проекте.
В этом посте:
• Ранний запуск кода убирает неожиданные задержки во время старта;
• Чёткий порядок шагов помогает быстро ловить мелкие баги;
• Грамотная инициализация ускоряет запуск и упрощает будущие правки.
👩💻 Когда await спасает интерфейс от немого зависания?
Асинхронность — это не просто техника ускорения, а способ сохранить живость интерфейса. Правильное использование await делает взаимодействие с приложением плавным, отзывчивым и естественным для пользователя.
В этом гайде:
• Помогаем коду “дышать” без остановки и ожидания
• Делаем действия пользователя мгновенно ощущаемыми и живыми
• Учимся писать обработчики, которые не тормозят весь поток
Как убрать 10 одинаковых using в каждом файле?
В проектах быстро появляется “шапка”, которая копируется из файла в файл: System, Linq, коллекции, логирование, общие неймспейсы фреймворка. Полезного кода ещё нет, а сверху уже простыня.
using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
// + ещё 5–10 строк...
using в один файл и сделать их глобальными — тогда они автоматически применяются ко всему проекту:// GlobalUsings.cs
global using System;
global using System.Linq;
👩💻 Сколько времени прошло на самом деле?
Переведём сухие числа разницы во времени в живые фразы, чтобы «через час» и «три дня назад» звучали естественно и не требовали пересчёта.
В этой задаче узнаешь:
• Как почувствовать разницу между датами, а не числами;
• Где естественно сказать «назад», а где «через»;
• Почему короткая фраза о времени понятнее таймера.
Как упростить работу с индексами и подстроками?
Классический подход — вечные Substring и ручные вычисления длины. В итоге получаем выражения, которые трудно читать и легко сломать:
var lastChar = input[input.Length - 1];
var withoutLast = input.Substring(0, input.Length - 1);
Length, особенно при работе с расширениями файлов, префиксами и хвостами строк.^) и диапазонами (..) в C# можно писать это намного компактнее и ближе к тому, как мы думаем о строке:var lastChar = input[^1]; // последний символ
var withoutLast = input[..^1]; // всё, кроме последнего
^1 — “первый элемент с конца”, [..^1] — “с начала до элемента перед последним”. Для хвостов и расширений тоже получается читаемое правило: [^3..] — последние три символа, [..^4] — всё, кроме последних четырёх.Substring, меньше ручных Length - 1, код читается как работа с отрезками строки, а не как арифметика с индексами.
👍 Разбор C# async/await — понятное объяснение асинхронности без чёрной магии!
В этой статье:• Когда использовать асинхронность: IO-bound против CPU-bound операций• Как async/await компилятором превращается в машину состояний• Примеры Task, ValueTask, WhenAny и обработка исключений без магии
🔊 Продолжай читать на Habr!
🧐 Напоминалка по netcat!
На картинке — компактная шпаргалка по nc: от сканирования портов до туннелей, чата и копирования дисков прямо из терминала.
Сохрани, чтобы под рукой был швейцарский нож сетевика!
➡️ C# Ready | #ресурс
⚡️ В сети начали массово сливать курсы и книги известных онлайн школ по айти
Вот отсортированная база с тонной материала (постепенно пополняется):
(363 видео, 87 книги) — Python
(415 видео, 68 книги) — Frontend
(143 видео, 33 книги) — ИБ/Хакинг
(352 видео, 89 книги) — С/С++/C#
(343 видео, 87 книги) — Java/QA
(176 видео, 32 книги) — Git/Linux
(174 видео, 91 книги) — DevOps
(167 видео, 53 книги) — PHP/1С
(227 видео, 83 книги) — SQL/БД
(114 видео, 77 книги) — Сисадмин
(107 видео, 43 книги) — BA/SA
(181 видео, 32 книги) — Go/Rust
(167 видео, 43 книги) — Kotlin/Swift
(112 видео, 24 книги) — Flutter
(137 видео, 93 книги) — DS/ML
(113 видео, 82 книги) — GameDev
(183 видео, 37 книги) — Дизайн
(136 видео, 33 книги) — PM/HR
Скачивать ничего не нужно — все выложили в Telegram
Программисты, это вам 👇
Держите 5 каналов, которые реально помогают изучать программирование и IT с полного нуля:
🖥 Easy Coder — все направления IT.
👩💻 Easy Python — всё о Python.
🌐 Easy WebDev — Frontend, Backend.
🔠 Easy InfoSec — ИБ, Хакинг.
🐱 Easy GitHub — лучшее с GitHub.
Тонны полезной инфы для любого уровня подготовки ✔️
👩💻 Асинхронность без лишних сложностей!
Асинхронный код помогает программе оставаться живой и отзывчивой, позволяя выполнять долгие операции в фоне, не блокируя остальные части приложения и не создавая ощущение задержек.
В этом гайде:
• Показываем, как ожидание не мешает выполнению программы;
• Объясняем, почему асинхронность делает интерфейс плавнее;
• Помогаем понять, где фоновые задачи действительно полезны.
👩💻 Строим карту длины слов в тексте!
Мы превратим обычный ввод из консоли в небольшое исследование: возьмём текст, очистим его и соберём статистику по длинам слов, чтобы увидеть структуру фразы под новым углом.
В этой задаче:
• Превратим сырой набор строк в понятный материал для анализа;
• Увидим, как разные слова распределяются по длине и частоте;
• Сделаем простую таблицу, которая сразу показывает скрытые закономерности.
👩💻 Файлы без страха и боли!
Работа с файлами кажется сложной, пока не увидишь наглядные примеры: несколько понятных приёмов уже закрывают чтение, запись и простое логирование.
В этом гайде:
• Покажем, как аккуратно читать содержимое текстового файла;
• Разберём, как сохранять строки и дописывать новые;
• Поможем перестать бояться путей, ошибок и пустых файлов.
Быстрые lookup-таблицы с FrozenDictionary в .NET 8!
Когда у тебя есть справочники «один раз создал — тысячу раз читаешь» (коды стран, статусы, типы операций), обычный Dictionary ок, но в .NET 8 можно выжать ещё больше скорости и меньше памяти.
Сначала собираем данные как обычно, затем «замораживаем» словарь:
using System.Collections.Frozen;
var countryCodes = new Dictionary<string, string>
{
["FI"] = "Finland",
["SE"] = "Sweden",
["NO"] = "Norway",
["DK"] = "Denmark",
};
// Один раз преобразуем в FrozenDictionary
var frozenCountryCodes = countryCodes.ToFrozenDictionary();
// Дальше работаем только с frozen-версией
if (frozenCountryCodes.TryGetValue("FI", out var name))
{
Console.WriteLine(name); // Finland
}
FrozenDictionary оптимизирован под частые чтения:Dictionary,FrozenSet:using System.Collections.Frozen;
var euCountries = new[] { "FI", "SE", "NO", "DK" }.ToFrozenSet();
if (euCountries.Contains("FI"))
{
Console.WriteLine("EU country");
}
FrozenDictionary/FrozenSet.
👩💻 Безошибочная работа со словарями!Овладей Dictionary — добавляй пары без неожиданностей, извлекай значения надёжно и убирай лишнее одним вызовом, сохраняя код чистым, понятным и отзывчивым.
➡️ C# Ready | #шпора
Меньше бойлерплейта с primary constructors в C# 12!
Часто сервисы и модели обрастают полями DI и свойствами — код пухнет. В .NET 8 можно объявить всё прямо в заголовке класса.
Было ― вручную пишем конструктор и поля:
public class UserService
{
private readonly ILogger<UserService> _logger;
private readonly IUserRepo _repo;
public UserService(ILogger<UserService> logger, IUserRepo repo)
{
_logger = logger;
_repo = repo;
}
public Task<User?> GetAsync(Guid id) => _repo.FindAsync(id, _logger);
}
primary constructor + автоматические свойства:public class UserService(ILogger<UserService> Logger, IUserRepo Repo)
{
public Task<User?> GetAsync(Guid id) => Repo.FindAsync(id, Logger);
}
primary constructors вырезают шаблонный код: меньше строк, чище классы, быстрее читается ревью.
🖥 C# - обучение с помощью картинок и коротких видео, авторы объясняют сложные концепции и учат профессиональному подходу в работе на шарпе.
🔥C# задачи - разбираем ваш код и вопросы с собеседований на практике.
📔 C#/C++ lib - огромная библиотека книг.
🧠 Machine learning - показываем на примере как использовать AI, который может генерировать готовые базы данных, код, разбираем все что нужно знать в области ИИ.
🖥 SQLHUB – вся база по работе с SQL.
🖥 С++ Академия — самый крупный обучающий ресурс в Telegram, посвященный С++.
🔝 Здесь мы собрали самые полезные ресурсы для С#/.Net разработчиков.
⚡️⚡️⚡️ Мы собрали 7 самых сильных IT-каналов 2025 года.
Никакой воды — только боевой стек:
⌨️ Pro Python • IT – от скриптов до нейросетей
⚙ Pro DevOps | Linux – автоматизация, облака, администрирование
👣 Pro Go – высоконагруженные системы и микросервисы
🖥 Pro JavaScript & TypeScript – полный стек
⚙ Pro Backend – архитектура, базы данных, API
🖥 Pro Frontend – современные фреймворки и инструменты
⌨️ Pro Java – промышленная разработка и фреймворки
Подписывайся сейчас, смотреть будешь потом! 👍