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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
⭐️ Безопасная очистка строки

Чтобы не упасть на удалении пробелов по краям строки можно использовать ванлайнер:
var clean = input?.Trim() ?? string.Empty;


?. вызывает Trim() только если input не null, иначе возвращает null
?? подставляет пустую строку, если результат null

Итог: строка очищена от пробелов, либо получаем пустую строку — без риска.

Откройте своим друзьям путь в айти с помощью нашего курса по основам IT для непрограммистов. До конца октября со скидкой!

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱23👍73
✏️ Как заработать на всех взлётах цены акций

Дан массив цен акций по дням. Нужно найти максимальную прибыль, совершая любое количество сделок купли-продажи. Одновременно можно держать только одну акцию.

Пример:
Цены: [7, 1, 5, 3, 6, 4]
Ответ: 7

Покупаем за 1, продаём за 5 (прибыль 4). Покупаем за 3, продаём за 6 (прибыль 3). Итого — 7.

Алгоритм

Самый простой подход — жадный алгоритм. Если завтра цена выше, чем сегодня — покупаем сегодня и продаём завтра. Собираем прибыль с каждого роста цены.

Представьте график цен: вам нужно получить прибыль со всех участков, где график идёт вверх. Неважно, сколько это будет сделок — каждый рост приносит деньги.

Почему это работает

Если цена растёт три дня подряд (например, 1 → 3 → 5), то неважно, продавать ли каждый день или держать до конца.

Код:
public class Solution 
{
public int MaxProfit(int[] prices)
{
if (prices == null || prices.Length < 2)
return 0;

int totalProfit = 0;

for (int i = 1; i < prices.Length; i++)
{
// Если цена выросла — берём эту прибыль
if (prices[i] > prices[i - 1])
{
totalProfit += prices[i] - prices[i - 1];
}
}

return totalProfit;
}
}


Или ещё компактнее:
public class Solution 
{
public int MaxProfit(int[] prices)
{
int profit = 0;

for (int i = 1; i < prices.Length; i++)
{
profit += Math.Max(0, prices[i] - prices[i - 1]);
}

return profit;
}
}


Жадный подход здесь безупречен: захватываем каждый рост, игнорируем падения. Никаких сложных расчётов оптимальных точек — только простая логика и максимальная прибыль.

➡️ Попробовать решить

Чтобы щёлкать такие задачи нужно знать алгоритмы. Подтянуть такую базу поможет наш курс по алгоритмам. До конца октября скидка 40%

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

#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6👍1
⚡️ Динамическая сортировка в EF Core

Представьте: у вас API со списком заказов. Клиент может сортировать по любому полю через параметры запроса. Без динамики пришлось бы писать switch на все варианты:
IQueryable<Order> query = context.Orders;

query = sortBy switch
{
"total_asc" => query.OrderBy(o => o.TotalAmount),
"total_desc" => query.OrderByDescending(o => o.TotalAmount),
"date_asc" => query.OrderBy(o => o.CreatedAt),
"date_desc" => query.OrderByDescending(o => o.CreatedAt),
// ещё 20 полей...
};


С динамической сортировкой код становится лаконичным:
var orders = context.Orders
.Where(o => o.Status == OrderStatus.Completed)
.OrderBy("TotalAmount DESC")
.ThenBy("CreatedAt ASC");


Имя поля и направление сортировки передаются строкой. Всё остается IQueryable — запрос уходит в базу, а не выполняется в памяти.

Можно комбинировать несколько уровней сортировки, передавая массив строк от клиента.

Если строка сортировки приходит от пользователя, нужна валидация. Иначе можно получить exception на несуществующем поле или, хуже, уязвимость.

Попробовать либу:
dotnet add package System.Linq.Dynamic.Core


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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔129👍2
🤨 На одну вакансию теперь 2383 отклика

Вакансий для программистов стало на 17% меньше, резюме — на 25% больше. Рынок изменился: теперь это не «рынок кандидата», а «рынок работодателя».

В статье про то, что происходит с зарплатами, какие специалисты сейчас наиболее востребованы и почему одного знания языка уже недостаточно

➡️ Узнать как там рынок

🐸 Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1
🔥 Когда понимаешь SOLID — жизнь становится проще

В октябре действует скидка 40% на все курсы от Proglib Academy, включая интенсив «Архитектуры и шаблоны проектирования»

📘 На интенсиве ты:

— разберёшься, как проектировать приложения, которые не ломаются при каждом изменении;
— освоишь SOLID-принципы, IoC, адаптеры и фабрики;
— научишься строить масштабируемые архитектуры;
— создашь собственную игру «Звёздные войны».

👨‍💻 Примеры кода на C#, Java, Python, PHP, C++ и JavaScript. Главное — понимать принципы, а не язык.

Преподаватель — Евгений Тюменцев, директор компании HWdTech, разрабатывал многопоточные кроссплатформенные приложения для IBM Watson.

📆 Формат: онлайн, 1 месяц.
📚 9 лекций + 2 бонусных занятия + практика.

Интенсив подойдёт джунам, которые хотят апнуться до мидла, и мидлам, мечтающим о роли архитектора.

👉 Переходи к курсам со скидкой 40%
1👍1😁1
👀 Что такое Мультикаст-делегат

Когда вы работаете с делегатами в C#, есть одна особенность, которая может превратить обычный делегат в мощный инструмент. Речь о multicasting — возможности связать с одним делегатом сразу несколько методов.

Представьте, что у вас есть делегат. Обычно он указывает на один метод. Но в C# делегаты можно комбинировать:
public delegate void NotifyHandler(string message);

NotifyHandler handler = LogToConsole;
handler += SendEmail;
handler += SaveToDatabase;

handler("Пользователь авторизовался");


Когда вы вызовете handler, все три метода выполнятся последовательно. Именно эта возможность называется мультикаст.

Основной сценарий — реализация паттерна Observer без лишних сложностей. Вы подписываете несколько обработчиков на одно событие, и все они получают уведомление.

Важные детали

• Методы вызываются в том порядке, в котором вы их добавили. Но полагаться на конкретный порядок — плохая практика. Ваши обработчики должны быть независимыми.

• Если делегат возвращает значение, вы получите результат только от последнего метода в цепочке.

• Если один из методов выбросит исключение, остальные не выполнятся.

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5🥱21👍1
💻 3 ядра 3 гига

Каждому разрабу нужно только одно — рабочий компьютер. У каждого он свой. На винде, на линуксе или может даже на макОси.

💬 Какой у вас сетап? Сколько ядер? Какая видеокарта? Хвастайтесь своими машинками в комментах 👇

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

#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
4
⚙️ Современные помощники для валидации параметров

Помните те времена, когда каждый метод начинался с целой простыни проверок входных параметров? Копипаста if (string.IsNullOrEmpty(...)) была ежедневной рутиной:
public void ProcessUser(string name, string email, int age)
{
if (string.IsNullOrEmpty(name))
throw new ArgumentException("Value cannot be null or empty.", nameof(name));

if (string.IsNullOrEmpty(email))
throw new ArgumentException("Value cannot be null or empty.", nameof(email));

if (age < 0)
throw new ArgumentOutOfRangeException(nameof(age), "Value must be non-negative.");

// Наконец-то бизнес-логика!
}


Код становился шумным, а реальная логика терялась в океане проверок. Каждый разработчик писал по-своему, сообщения об ошибках отличались, а про опечатки в nameof() вообще молчим.

Теперь всё это превращается в лаконичные однострочники:
public void ProcessUser(string name, string email, int age)
{
ArgumentException.ThrowIfNullOrEmpty(name);
ArgumentException.ThrowIfNullOrEmpty(email);
ArgumentOutOfRangeException.ThrowIfNegative(age);
}


Стандартная библиотека предлагает методы на все случаи жизни:
// Проверки на null
ArgumentNullException.ThrowIfNull(user);

// Числовые диапазоны
ArgumentOutOfRangeException.ThrowIfNegative(temperature);
ArgumentOutOfRangeException.ThrowIfZero(divisor);
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(count);

// Сравнения
ArgumentOutOfRangeException.ThrowIfGreaterThan(progress, 100);
ArgumentOutOfRangeException.ThrowIfLessThan(quantity, 1);
ArgumentOutOfRangeException.ThrowIfEqual(status, Status.Invalid);
ArgumentOutOfRangeException.ThrowIfNotEqual(version, expectedVersion);


Эти методы — не просто синтаксический сахар. Они воплощают принцип fail-fast: обнаруживай проблемы немедленно, не позволяй невалидным данным распространяться по системе.

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62❤‍🔥1🤔1