Библиотека шарписта | C#, F#, .NET, ASP.NET
22.3K subscribers
2.57K photos
41 videos
85 files
4.84K links
Все самое полезное для C#-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
🎮 Память в Unity и лаги, что реально чинит FPS

Мы делились этой статьей, и сейчас напомним. Главная мысль простая, лаги часто приходят не из за рендера, а из за памяти и резких скачков GC.

➡️ В статье объясняют, почему аллокации и сборщик мусора могут давать фризы и как с этим жить

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
🥇 Золотая лихорадка закончилась

2025-й стал годом «скучной стабильности» в айти. Компании не росли — выживали: резали бюджеты, оптимизировали команды, затягивали найм.

2383 отклика на 1 вакансию.
−20% позиций за год.
30-50% сокращений в e-commerce.

➡️ Полный разбор рынка

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
😢23🤔1🤩1
🧑‍💻 Универ, курсы или самоучка

Мы уже спорили про это раньше, а сейчас напомним, потому что под конец года многие планируют, как учиться дальше. Универ, курсы, самообучение это три разные модели, и у каждой свои риски.

➡️ Если хочется курсы, можно посмотреть, что есть в Proglib Academy.

💬 А у вас что сработало, универ, курсы или самообучение, и почему?

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
От монолитов к мультиагентным системам на C#

Интеграция LLM в .NET проекты — это уже не только Semantic Kernel. В 2026 году фокус смещается на создание автономных команд агентов, использующих паттерн ReAct.

На курсе «Разработка AI-агентов» мы разбираем, как строить такие системы профессионально.

В программе:

— архитектура «мозга» агента: связка Reasoning + Acting;
— оркестрация через n8n и работа с внешними API;
— протокол MCP от Anthropic для мультиагентного взаимодействия;
— глубокие системы поиска знаний (RAG) для работы с документами.

Это твой шанс войти в рабочий ритм с технологиями будущего.

🧨 До 12 января действует акция «3 в 1»: курс по ИИ-агентам + 2 курса в подарок.

Начать обучение
😢5🔥3🥱2🌚1
💡 Красочно про LINQ

Вспоминаем лучшую шпаргалку 2025 по методам LINQ.

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33🥱135😁4🔥3
Сколько задач нарешали за 2025 год

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
😁14
🎮 DI в Unity, чтобы проект не слипся в комок

Мы уже кидали этот материал в ленту в начале года, и сейчас напомним его снова. В Unity код часто завязывается на MonoBehaviour и Scene, из за этого зависимости расползаются и тестировать становится больно.

➡️ Статья как раз объясняет, почему с DI в Unity все не так гладко, как в обычном C#

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32😁1
🤨 Неочевидная проблема FirstOrDefault

Метод FirstOrDefault из LINQ часто вводит в заблуждение разработчиков. Он берёт первый элемент из последовательности или выдаёт дефолтное значение типа, когда список пуст. Для структурных типов вроде int это 0, для ссылок null.

Возьмём пустой List<int>. Вызов numbers.FirstOrDefault() отдаст 0, и если в бизнес-логике 0 значит нет данных, код сломается тихо.

var numbers = new List<int>();
var result = numbers.FirstOrDefault(); // 0, а не то, что ожидали


Чтобы фиксить, проверяйте Any() заранее или цепляйте DefaultIfEmpty(-1). Тогда для пустоты выйдет контролируемое значение, код станет предсказуемым.

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🥱131
👨‍💻 Давайте вновь поспорим, нужны ли комментарии в коде

💯 — Нужны
⚡️ — Можно и без них

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
💯101521
💡 Рейтинг TIOBE за декабрь

Остальные языки теряют позиции и поднимаются вверх, а C# стабильно держит своё 5 место.

➡️ Рейтинг

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14😁42
💾 Как выбрать стратегию кэширования: разбор 7 популярных алгоритмов

Кешировать нужно с умом. И нет, LRU — не серебряная пуля.

В статье вас ждёт разбор алгоритмов: LRU, LFU, FIFO и другие
– Примеры, где каждый работает лучше
– Плюсы и минусы подходов
– Практические советы по выбору стратегии

Если проектируете систему с большими нагрузками или оптимизируете производительность — материал будет как раз.

➡️ Читать статью

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱4🔥2
🤩 Паттерн-матчинг в C#

Pattern-matching — это функциональность языка, позволяющая проверять объект на соответствие определённому шаблону и выполнять действия, если объект удовлетворяет этим условиям.

Этот механизм помогает писать более читабельный и компактный код, устраняя необходимость в громоздких конструкциях вроде if-else или switch.

Паттерн-матчинг в C# активно развивается с каждой новой версией языка и поддерживает множество типов паттернов, таких как:

1️⃣ Проверка типа

Используется для проверки типа объекта и его преобразования в этом же выражении:
object obj = "Hello, world!";
if (obj is string str)
{
Console.WriteLine($"Длина строки: {str.Length}");
}


2️⃣ Константные паттерны

Проверяет значение переменной на соответствие константе:
int number = 42;
if (number is 42)
{
Console.WriteLine("Число равно 42");
}


3️⃣ Реляционные и логические паттерны

Сравнивает значения и комбинирует паттерны с помощью логических операторов (and, or, not):
int age = 25;
if (age is > 18 and < 30)
{
Console.WriteLine("Возраст в диапазоне от 18 до 30");
}


4️⃣ Паттерны в выражении switch

Улучшает конструкцию switch, позволяя использовать сложные условия:
object shape = new Circle { Radius = 5 };

string description = shape switch
{
Circle { Radius: > 0 } c => $"Круг с радиусом {c.Radius}",
Rectangle { Width: > 0, Height: > 0 } r => $"Прямоугольник {r.Width}x{r.Height}",
_ => "Неизвестная форма"
};



5️⃣ Свойственные паттерны

Позволяют проверять свойства объекта:
Person person = new Person { Name = "Alice", Age = 30 };

if (person is { Name: "Alice", Age: > 25 })
{
Console.WriteLine("Это Алиса старше 25 лет");
}


6️⃣ Список и позиционные паттерны

Используются для проверки списков и кортежей:
int[] numbers = { 1, 2, 3 };

if (numbers is [1, 2, 3])
{
Console.WriteLine("Массив содержит 1, 2, 3");
}


📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🥱311👾1
⚡️ DeepSeek + .NET

Снова делимся с вами инструкцией по интеграции DeepSeek в .NET:

1. Создаём новое консольное приложение и устанавливаем необходимые пакеты: инициализируем проект и добавляем библиотеки для работы с HTTP-запросами и конфигурацией JSON.

2. Настраиваем файл appsettings.json: добавляем базовый URL и API-ключ DeepSeek для последующего взаимодействия с API.

3. Определяем модели данных: создаём классы для представления структуры запросов и ответов API.

4. Создаём сервис для взаимодействия с API: реализуем логику отправки сообщений и обработки ответов от DeepSeek.

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

📎 Статья с реализацией

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
5🥱3
C# в 2026-м: от Task.Run к Agent.Run

Зачем просто писать асинхронный код, если можно запустить команду автономных агентов? В новом году Enterprise-разработка переходит на рельсы мультиагентности.

Прокачайте свой стек на курсе по AI-агентам:

— реализуйте паттерн ReAct для принятия решений внутри .NET систем;
— свяжите бизнес-логику с внешними API через n8n;
— освойте протокол MCP для межсистемного взаимодействия агентов;
— внедрите RAG для мгновенной обработки корпоративных данных.

Ваш идеальный дипломный проект: автономная группа агентов, решающая задачи за целый отдел.

❄️ До 12 января действует акция «3 в 1»: курс по ИИ-агентам + 2 курса в подарок.

Стать архитектором агентов
🎉4
🔢 Сортировка строк с числами

Мы уже упоминали эту новость из Preview. Сейчас она в .NET 10, и стоит напомнить, что проблема file1, file10, file2 больше не актуальна.

Суть в CompareOptions.NumericOrdering. Issue #13979 висела с 2015, и вот она решена нативно. Флаг заставляет сравнивать цифры как числа, а не посимвольно, так что последовательности вроде версий или имен файлов идут правильно.

Протестить:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;

var files = new List<string> { "file10", "file2", "file1", "file20" };

// Обычная сортировка
var sortedLex = files.OrderBy(f => f).ToList();
Console.WriteLine("Лексикографическая: " + string.Join(", ", sortedLex));
// file1, file10, file20, file2

// Числовая сортировка
var comparer = StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.NumericOrdering);
var sortedNumeric = files.OrderBy(f => f, comparer).ToList();
Console.WriteLine("Числовая: " + string.Join(", ", sortedNumeric));
// file1, file2, file10, file20


📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35🔥1
⚙️ Scalar в ASP.NET вместо скучного Swagger

Мы уже делились этим материалом весной, и сейчас самое время напомнить. Scalar это интерактивный UI для OpenAPI, который можно подключить к ASP.NET Core и получить более приятную документацию, чем стандартный Swagger UI.

Процесс установки не сложный, а результат превзойдет все ожидания.

➡️ Прочитать статью

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰42❤‍🔥1
👣 JSON в классы через специальную вставку

Мы уже показывали этот трюк, и сейчас напомним, потому что он спасает часы ручного набора классов. В Visual Studio Edit → Paste Special → Paste JSON As Classes генерирует классы из JSON в буфере, включая атрибуты сериализации.

Пример:
  "Colors": [
{
"numberKey": 1,
"isPrimary": true,
"listColors": ["Red", "Blue", "Yellow"]
},
{
"numberKey": 2,
"isPrimary": false,
"listColors": ["Purple", "Green", "Orange"]
}
]
}


Сгенерированный C# код:
public class Root
{
public Color[] Colors { get; set; }
}

public class Color
{
public int NumberKey { get; set; }
public bool IsPrimary { get; set; }
public string[] ListColors { get; set; }
}



📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18😁3🔥211
Чек лист по LINQ, который реально помогает

Тогда мы уже выкладывали похожий чек лист, и сейчас вспомним.

Основные принципы LINQ

✓ Понимать разницу между IEnumerable<T> и IQueryable<T>
✓ Фильтровать (Where()) данные как можно раньше в цепочке вызовов.
✓ Извлекать (Select()) только нужные поля, а не всю сущность.
✓ Использовать Any() вместо Count() > 0 для проверки наличия элементов.
✓ Избегать многократных проходов по коллекции (повторных .Where(), .Select())
✓ Знать разницу между отложенным и немедленным выполнением.

Работа с Where, Select, FirstOrDefault

✓ Не использовать Where().FirstOrDefault() – просто FirstOrDefault().
✓ Вызывать Where() перед Select(), а не наоборот.
✓ Использовать FirstOrDefault(predicate), если проверяется только одно значение.

Nullable

✓ Использовать ?? для значений, которые могут быть null.
✓ Использовать DefaultIfEmpty() при GroupBy().

Избегание дублирующих данных

✓ Использовать Distinct() для уникальных значений.
✓ Использовать Union() для объединения без дубликатов.
✓ Использовать Except() и Intersect() для разницы между коллекциями.

Помните, что LINQ — это не просто удобство, а инструмент, требующий понимания его тонкостей.

📍 Навигация: ВакансииЗадачиСобесы

🐸Библиотека шарписта

#лучшее_из_библиотеки_2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍225