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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
Количество уникальных букв в строке

1. Создаем строку str, которую нужно проанализировать.
2. Применяем метод Distinct() для получения уникальных символов в строке.
3. Вызываем метод Count() для получения количества элементов в последовательности уникальных символов.
4. Добавляем параметр char.IsLetter, чтобы учитывать только буквы алфавита.
😁25🥱8🔥6🤔1😍1
📝 Visual Studio теперь сам пишет комментарии

Microsoft представила автоматическую генерацию комментариев в Visual Studio с помощью GitHub Copilot.

Теперь, просто введя /// перед методом, можно получить готовое описание его работы, параметров и возвращаемого значения.

• Доступно в Visual Studio 17.14 Preview 2.

➡️ Подробнее в блоге разработчиков

Как думаете, полезно или лучше вообще не писать комментарии? 💬

🐸Библиотека шарписта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍40👏43😁2🔥1
🐧 Пингвин, покоривший мир: история взлета Linux – ОС, управляющей 96% серверов

В 1991 году на компьютере с 4 мегабайтами памяти родилась программа, которая сегодня управляет большей частью интернета, смартфонами и даже космическими аппаратами. Это история Linux, рассказанная одним из первых свидетелей.

➡️ Читать статью
➡️ Зеркало
👍4🌚3😁1
💾 Шпаргалка по C#

Все важные моменты в одном репозитории. Сохраняйте себе в закладки.

➡️ Репозиторий со шпаргалкой

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👾4🤔1
🎮💾 Оптимизация памяти в Unity: как избежать лагов и повысить FPS в играх

Оптимизация памяти в Unity — ключ к стабильной работе игр. Если хочется избежать лагов и повысить FPS, важно правильно управлять памятью. Использование эффективных методов загрузки и выгрузки данных, уменьшение количества аллокаций и грамотное применение сборщика мусора помогут улучшить производительность и стабильность игры.

➡️ Подробнее в статье

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
⚙️ Передаём данные между потоками

В C# есть несколько способов передать данные из одного потока в другой. Выбор зависит от требований к производительности, удобству и безопасности. Несколько распространенных вариантов:

1️⃣ Использование BlockingCollection<T>

Это потокобезопасная коллекция, позволяющая передавать данные от одного потока к другому.
var collection = new BlockingCollection<int>();

// Поток-поставщик (Producer)
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
collection.Add(i);
Console.WriteLine($"Производитель: добавил {i}");
Thread.Sleep(500);
}
collection.CompleteAdding();
});

// Поток-потребитель (Consumer)
Task.Run(() =>
{
foreach (var item in collection.GetConsumingEnumerable())
{
Console.WriteLine($"Потребитель: получил {item}");
}
}).Wait();


2️⃣ Использование TaskCompletionSource<T>

Когда нужно передать значение между потоками в будущем.

var tcs = new TaskCompletionSource<int>();

// Поток-поставщик
Task.Run(() =>
{
Thread.Sleep(2000);
tcs.SetResult(42);
});

// Поток-потребитель
int result = await tcs.Task;
Console.WriteLine($"Получено: {result}");


3️⃣ Использование ConcurrentQueue<T>

Если нужно неблокирующее хранилище данных.

var queue = new ConcurrentQueue<int>();

// Поток-поставщик
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
queue.Enqueue(i);
Console.WriteLine($"Добавлено {i}");
Thread.Sleep(500);
}
});

// Поток-потребитель
Task.Run(() =>
{
while (true)
{
if (queue.TryDequeue(out int item))
{
Console.WriteLine($"Получено {item}");
}
Thread.Sleep(100);
}
}).Wait();


4️⃣ Использование Channel<T> (System.Threading.Channels)

Альтернативный подход к BlockingCollection<T>

var channel = Channel.CreateUnbounded<int>();

// Поток-поставщик
_ = Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
await channel.Writer.WriteAsync(i);
Console.WriteLine($"Производитель: {i}");
await Task.Delay(500);
}
channel.Writer.Complete();
});

// Поток-потребитель
await foreach (var item in channel.Reader.ReadAllAsync())
{
Console.WriteLine($"Потребитель: {item}");
}


💬 Какой вариант вам больше всего понравился?

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍37
💬 Как оставлять комментарии в чате нашего канала

В нашем чате работает бот Shieldy — он защищает от спама, запрашивая у новых участников решение простой капчи.

⚠️ Проблема, с которой сталкиваются многие: вы нажимаете под постом «Прокомментировать», пишете что-то, а потом получаете бан и не можете писать комментарии.

Почему так: Shieldy отправляет капчу в сам чат, а не в комментарии под конкретный пост. Из-за этого капчу можно не увидеть, не отправить ответ на нее, и бот автоматически заблокирует вас.

Как присоединиться к чату, чтобы бот вас не забанил

— Зайдите в описание канала с телефона и нажмите кнопку Discuss / Чат
— Нажмите Join / Присоединиться
— Сразу обратите внимание на сообщение от бота Shieldy
— Решите простой пример и отправьте ответ в чат

После этого бот отправит приветственное сообщение и вы сможете оставлять комментарии. Эту проверку нужно пройти только один раз при вступлении в чат.

❗️ Если вас все-таки забанили

— Это временная блокировка на несколько минут
— Подождите и попробуйте зайти позже, бот снова отправит вам капчу

Админы канала никак не могут ускорить процесс, бот автоматически снимает с вас блокировку через пару минут. Мы понимаем, что эта система неидеальна, и ищем более удобное решение.

👾 Спасибо, что активно участвуете в обсуждении наших постов!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
😊 Промт дня: генератор регулярных выражений

Регулярные выражения это что-то на эльфийском. Вместо ручного написания попросите об этом нейросеть с помощью промта:
I want you to act as a regex generator. Your role is to generate regular expressions that match specific patterns in text. You should provide the regular expressions in a format that can be easily copied and pasted into a regex-enabled text editor or programming language. Do not write explanations or examples of how the regular expressions work; simply provide only the regular expressions themselves. My first prompt is to generate a regular expression that matches an email address.


В этом примере будет сгенерировано выражение, для матчинга email-адресов.

💬 Часто пишете регулярки? Делитесь в комментариях! 🚀


🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🥱12😁2👾1
🤯 Баги, которые IDE не смогла предсказать

Программисты доверяют своим инструментам, но иногда даже самая умная IDE оказывается бессильна перед хитроумными багами. Это те моменты, когда компилятор молчит, дебаггер пожимает плечами, а ты смотришь в монитор и думаешь: «Как так-то».

🛠 В Библиотеке программиста мы считаем, что самые крутые истории — это те, которые заставляют нас учиться. Делитесь своими случаями, когда:

— Компилятор не ругался, но всё работало "не так".
— Ошибка пряталась в очевидном месте, но её никто не замечал.
— Код выглядел идеально, но прод сказал: "ну ты и наделал..."
— Рефакторинг только ухудшил ситуацию.

Начнём с нашего админа:
Одной из моих первых фичей была отправка письма по шаблону. Отправку реализовал — с этим проблем не возникло. Добавил логирование, чтобы отслеживать какие письма кому идут. Так случилось, что на тестирование подзабили, потому что письма на тестовой среде не отправлялись. Вывели это в прод и оказалось, что ошибся в форматировании строки в логах... IDE как-то упустила этот момент, а мне зелёному хотелось поскорее увидеть плоды своего творения. В тот же день я и повёз свой первый хотфикс.


🐸Библиотека шарписта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1🥰1😁1
💡 Лайфхак: foreach работает даже с числами

Начиная с C# 9 можно итерироваться по числам:
foreach (int x in 5)  
Console.Write($"{x} ");
// Вывод: 1 2 3 4 5

foreach (var n in 42..46)
Console.Write($"{n} ");
// Вывод: 42 43 44 45 46


Для этого достаточно добавить расширение метода GetEnumerator:
public static class Extensions
{
public static IEnumerator<int> GetEnumerator(this int x)
=> Enumerable.Range(1, x).GetEnumerator();

public static IEnumerator<int> GetEnumerator(this Range range)
=> Enumerable.Range(range.Start.Value, range.End.Value - range.Start.Value + 1).GetEnumerator();
}


💬 Уже использовали в работе или всё ещё балуетесь обычными циклами?

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🤔20🥱7🌚5🔥3
🧩💊 Алгоритмическая самоуспокоенность: как мы разучились думать своей головой

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

Это не просто влияет на настроение, но и на способность анализировать информацию, принимать решения и, главное, не становиться частью системы манипуляций.

Если вы хотите вернуться к осознанному подходу в восприятии мира и научиться фильтровать контент, то эта тема точно для вас.

🔗 Подробнее в статье

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
💯6👍3🔥2
👁 Прокачай внимательность

Перед тобой — сетка со словами, зашифрованными по горизонтали. Некоторые из них напрямую связаны с C#, другие — просто хорошо знакомы каждому программисту

💬 Напишите в комментариях, сколько слов смогли найти, и поделитесь своими находками под спойлером.

🐸Библиотека шарписта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32👾2🔥1
📰 Дайджест новостей за неделю

Собрали всё, что произошло на этой неделе, чтобы вы могли await важное без блокирующего Thread.Sleep(). Без null, без boxing, только актуальные штуки

🆕 .NET 10 Preview 2
Microsoft продолжает двигать .NET вперёд, и второй превью-релиз 10-й версии включает пачку обновлений во всех уголках платформы — от ядра до UI и облаков.

🧪 Microsoft обновили MSTest
Там не просто косметические апдейты. В этом релизе добавлено множество реально полезных фич, о которых просили разработчики.

🆕 MultiGit в Visual Studio
Теперь Visual Studio официально поддерживает работу с несколькими GitHub-аккаунтами.

📝 Visual Studio теперь сам пишет комментарии

🎮 Оптимизация памяти в Unity: как избежать лагов и повысить FPS в играх

🐸Библиотека шарписта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102🔥1
✍🏻 Какая из операций linq исключает дублирование одинаковых элементов в выходной последовательности?

Операция Distinct удаляет дублированные элементы из входной последовательности.

Библиотека собеса по С#
🥱39👍10😁2👾1
Какие две предопределенные функции наблюдаются при создании нового скрипта в Unity?

👾
— Start и Update
👍 — Awake и Start
🥰 — Void и Main
⚡️ — Ничего из вышеперечисленного

Библиотека задач по C#
👾743👍1🥰1🥱1
💾 Как выбрать стратегию кэширования: разбор 7 популярных алгоритмов

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

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

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

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

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
🪧 Достаём данные из Excel и обратно

Работа с Excel-файлами — одна из типичных задач в корпоративных приложениях. Часто возникает необходимость загрузить данные из Excel, обработать их и сохранить обратно. Рассмотрим простой способ решения этой задачи.

Для этого используем Spire.XlS.

1. Конвертируем Excel в DataTable
using Spire.Xls;
using System.Data;

// Загружаем Excel-файл
Workbook workbook = new Workbook();
workbook.LoadFromFile("example.xlsx");

// Берём нужный лист
Worksheet sheet = workbook.Worksheets[0];

// Конвертируем в DataTable
DataTable dt = sheet.ExportDataTable();


2. Конвертируем данные таблицы в Excel-документ
using Spire.Xls;
using System.Data;

// Заполняем DataTable вручную (или берём из БД)
DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Age");
dt.Rows.Add("Alice", "25");
dt.Rows.Add("Bob", "30");

// Создаём Excel-файл
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];

// Вставляем данные
sheet.InsertDataTable(dt, true, 1, 1);

// Сохраняем
workbook.SaveToFile("output.xlsx", ExcelVersion.Version2013);


Для чего используете Excel в работе? Админ как-то раз видел беклог в таблице. Делитесь своими задачками для Excel в комментариях👇

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🥱31
#️⃣🏗 Как не запутаться в структурах данных в Unity и C#

Когда работаете с Unity, почти каждая система — это работа с данными. Инвентарь, состояния врагов, квесты, сохранения. И вот тут важно не просто «что-то завести», а осознанно выбрать структуру данных под задачу.

Экономия памяти, меньше багов и чище код — это не абстрактные плюсы, а реальные бонусы при разработке.

➡️ Подробности в статье

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱8👍3
📓 Разбираем логи без боли

Когда логи становятся слишком большими, а обычные текстовые редакторы бессильны — на помощь приходит Analogy.LogViewer.
Он создан для того, чтобы навести порядок в хаосе логов: отладки, мониторинга, аудита.

Основные возможности:

Плагины: поддержка Serilog, NLog, log4net, JSON, CSV, текст, бинарщина и даже кастомный формат.

Поиск и фильтрация: по уровням, времени, ключевым словам, источнику.

Реалтайм логирование: логи можно стримить по TCP, UDP.

GUI настраивается: вкладки, темы, колонки, автообновление.

Он не спасёт от багов, но поможет найти их быстрее — и с меньшими нервами.

➡️ Репозиторий инструмента

🐸Библиотека шарписта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😁132👍2