C#razy
98 subscribers
215 photos
46 videos
2 files
345 links
Путь в IT, рост, менторство, поддержка, прокачка, мотивация

👨‍💻 Senior .NET dev с 12+ лет опыта
📚 Учусь в MIT по Computer Science
🖥 100+ дней подряд LeetCode
⚒️ Работаю на зарубеж
💻 Веду блог про рост в IT с нуля
🧭 Помогаю понять, куда двигаться
Download Telegram
#dotnet #husky #devtools

🧙‍♂️ Husky.NET: Автоматизация проверок кода в .NET проектах

Хотите повысить качество кода и автоматизировать проверку коммитов? Тогда вам стоит узнать о Husky.NET!

Husky.NET позволяет легко добавлять pre-commit хуки в ваши .NET проекты. Это инструмент, который поможет вам:
- Автоматически запускать тесты перед каждым коммитом
- Проверять код на соответствие стандартам с помощью линтеров
- Избегать распространенных ошибок и поддерживать чистоту кода

🔗 Подробнее о Husky.NET читайте в статье: https://www.code4it.dev/blog/husky-dotnet-precommit-hooks/

Не упустите возможность сделать процесс разработки более эффективным и надежным! 🚀

💡 Канал | 💬 Чат
🤔1
#dotnet

🚀 UUID v7 в .NET 9: Прорыв в генерации уникальных идентификаторов

Steven Giesel в своей новой статье представляет UUID версии 7 для .NET 9. Основное преимущество UUID v7 - временной штамп, который делает его идеальным для баз данных, улучшая сортировку записей. Новый метод Guid.CreateVersion7() упрощает создание временных UUID.

🔗 Подробнее здесь: https://steven-giesel.com/blogPost/ea42a518-4d8b-4e08-8f73-e542bdd3b983

Разработчики оценят эту инновацию за её удобство и эффективность!

💡 Канал | 💬 Чат
#dev #dotnet #qa

📚 Selenium WebDriver Recipes in C#: Practical Testing Solutions for Selenium WebDriver (2024)

✍️ Автор: Courtney Zhan

📃 Страниц: 331

В этом издании вы найдете обновленные инструкции по настройке Visual Studio, новые рецепты и главы о Selenium DevTools и непрерывном тестировании. Узнайте, как использовать Selenium WebDriver для работы с выпадающими списками, навигацией, утверждениями, фреймворками, загрузкой файлов и всплывающими диалоговыми окнами.

Что внутри:
🔸 Отладка тестов и тестовых данных
🔸 Работа с удаленным сервером Selenium
🔸 Управление профилями браузеров и их настройка
🔸 Мониторинг тестов для улучшения пользовательского опыта (UX)

💡 Канал | 💬 Чат
👨‍💻1
#dotnet

🧙‍♂️ Новинка в C# - JsonUnmappedMemberHandling

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

🔥 Встречайте JsonUnmappedMemberHandling - новое решение для обработки таких случаев в C#!

🔥 Теперь вы можете управлять тем, как ваш JSON-десериализатор будет реагировать на неизвестные свойства в JSON-объектах. Вот несколько ключевых моментов:

Skip - игнорирует неизвестные поля (поведение по умолчанию).
Disallow - выбрасывает исключение, если обнаружены неизвестные поля.

Пример использования:
[JsonUnmappedMemberHandling(JsonUnmappedMemberHandling.Disallow)]
public class MyClass
{
public int Id { get; set; }
public string Name { get; set; }
}


🔧 Зачем это нужно?
- Улучшает контроль над данными.
- Повышает стабильность и предсказуемость работы приложения.
- Облегчает отладку и тестирование.

📚 Ссылка на документацию Microsoft: https://learn.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonunmappedmemberhandling

💡 Канал | 💬 Чат
#dotnet

🕵️‍♂️ OWASP Cheat Sheet: Хранение Паролей 🔐

Сегодня хочу поделиться с вами важной информацией из OWASP о правильном хранении паролей. 🚀 Это критически важная тема для всех разработчиков и ИТ-специалистов, которые заботятся о безопасности своих пользователей. 🛡

🔍 Что это такое?
Cheat Sheet от OWASP — это руководство для разработчиков по безопасному хранению паролей. Оно помогает избежать распространенных ошибок и защищает данные пользователей.

📋 Основные рекомендации:

🔹Хэширование паролей
Используйте проверенные алгоритмы хэширования, такие как bcrypt, PBKDF2 или Argon2. Они специально разработаны для безопасного хранения паролей.

🔹Соль (Salt)
Добавляйте уникальную соль для каждого пароля перед его хэшированием. Это защищает от атак по словарю и rainbow table.

🔹Перец (Pepper)
Используйте глобальный секретный ключ (перец) в дополнение к соли для дополнительной защиты.

🔹Перечислимость (Iterations)
Увеличивайте количество итераций алгоритма хэширования, чтобы замедлить попытки взлома.

🔹Безопасное хранение
Никогда не храните пароли в открытом виде и не используйте слабые методы шифрования.

Пример метода для хэширования пароля на C#
public class PasswordHasher
{
// Глобальный секретный ключ (перец)
private static readonly string pepper = "SuperSecretPepperKey";

// Метод для хэширования пароля с использованием PBKDF2
public static string HashPassword(string password)
{
// Генерация соли
var salt = new byte[16];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(salt);
}

// Объединение пароля с перцем
string passwordWithPepper = password + pepper;

// Хэширование пароля с использованием PBKDF2
byte[] hashed = KeyDerivation.Pbkdf2(
password: passwordWithPepper,
salt: salt,
prf: KeyDerivationPrf.HMACSHA256,
iterationCount: 10000,
numBytesRequested: 32);

// Один из примеров конкатенация соли и хэша для хранения
byte[] hashBytes = new byte[salt.Length + hashed.Length];
Buffer.BlockCopy(salt, 0, hashBytes, 0, salt.Length);
Buffer.BlockCopy(hashed, 0, hashBytes, salt.Length, hashed.Length);

// Возврат хэша в виде строки для хранения
return BitConverter.ToString(hashBytes);
}
}


💡 Канал | 💬 Чат
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
#dotnet

🧙🏻‍♂️ C#: Разница между Any() и Exists()

В C# есть два схожих метода для проверки наличия элементов в коллекции — Any() и Exists(). Оба они могут использоваться для поиска элементов, но работают они немного по-разному. Предлагаю быстрый чек.

😐 В чем разница?
Any() — это метод расширения LINQ, который проверяет, есть ли хотя бы один элемент, соответствующий условию
Exists() — это метод класса List<T>, который также проверяет наличие элемента

😮 Benchmark
BenchmarkDotNet v0.14.0, macOS Sonoma 14.6.1 (23G93) [Darwin 23.6.0]
Apple M1 Max 2.40GHz, 1 CPU, 10 logical and 10 physical cores
.NET SDK 8.0.101
[Host] : .NET 8.0.1 (8.0.123.58001), X64 RyuJIT SSE4.2
DefaultJob : .NET 8.0.1 (8.0.123.58001), X64 RyuJIT SSE4.2


| Method | Mean | Allocated |
|------- |---------:|----------:|
| Any | 2.624 ms | 43 B |
| Exists | 1.136 ms | 12 B |


😐 Exists() - а что так можно было?какой ценой?
+ This method performs a linear search; therefore, this method is an O(n) operation, where n is count
+ Использование цикла for позволяет напрямую обращаться к элементам списка по индексу, что может быть быстрее в некоторых случаях, чем использование методов расширения LINQ
- работает только с List<T>
- невозможно проверить, пуст ли список

🐈 Код
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Running;

BenchmarkRunner.Run<AnyVsExistsBenchmark>();

[HideColumns(Column.Error, Column.StdDev), MemoryDiagnoser]
public class AnyVsExistsBenchmark
{
private readonly List<int> _numbers = Enumerable.Range(1, 1000000).ToList();

[Benchmark]
public bool Any() => _numbers.Any(x => x > 26082024);

[Benchmark]
public bool Exists() => _numbers.Exists(x => x > 26082024);
}


🏃‍♂️ Запуск
 dotnet run -c Release --project Benchmark


💡 Channel | ✏️ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
#dotnet

Ты еще не знаешь что такое ASP.NET Core? 😱

🧙‍♀️ Ускорь свою разработку на ASP.NET Core, просто воспользуйся этой дорожной картой и стань настоящим 🧙🏻‍♂️ разработки!

🔥 Твоя путеводная звезда в мире ASP.NET Core — дорожная карта ➡️ roadmap.sh

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
Branch Prediction: Как ваш процессор уже как 35 лет предсказывает будущее.

🧙🏻‍♂️ Современные процессоры уже давно получили свои экстрасенсорные способности. С помощью Branch Prediction они способны заглядывать в будущее и предугадывать, какой путь выполнится в вашем коде. Это как если бы ваш компьютер знал, что вам нужно сделать следующее, еще до того, как вы это сами осознаете!

Branch Prediction — это технология в процессорах, которая помогает предсказать, какой путь выберет программа, когда встречается условный переход (например, if или switch) и в условиях неопределённости. При выполнении условных инструкций (ветвлений) процессор должен решить, какой из возможных путей будет выбран, чтобы минимизировать задержки и улучшить производительность.

🙉 Почему это важно?
Когда процессор сталкивается с условным переходом, он должен решить, какой путь выполнить. Если процессор не знает, какой путь выбрать, он может просто сидеть и ждать, что замедляет работу. Branch Prediction помогает процессору заранее выбрать путь и продолжить выполнение инструкций, что значительно ускоряет работу.

🧐 Как это работает?
Процессор использует предыдущие результаты и алгоритмы, чтобы предсказать, какой путь будет выбран. На основе предсказания процессор начинает выполнять инструкции, даже прежде чем точно узнать, правильный ли путь выбран. Если предсказание оказывается неверным, процессор отменяет неверные инструкции и переходит к правильному пути. Это вызывает небольшую задержку, но обычно минимизирует ее.

👨🏻‍💻 Факт для IT
90% точность прогнозирования ветвлений выдают современные процессоры.
3 ns нужно процессору для обработки неверного предсказания ветвления и да это аппаратная и программная функция.

🔎 Проверим это всё кодом
Один и тот же метод, который обрабатывает каждый элемент массива одинаково. Возьмём: массив с рандомными числами, тот же но отсортированный массив, массив с только чётными числами и массив с чередующимися числами чёт/нечёт

👨‍💻 Код
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Running;

BenchmarkRunner.Run<BranchPrediction>();

[HideColumns(Column.Error, Column.StdDev), MemoryDiagnoser]
public class BranchPrediction
{
private const int N = 12_09_2024;

private int[] _unorderedArray = new int[N];
private int[] _ordered = new int[N];
private int[] _allAreOdd = new int[N];
private int[] _alternating = new int[N];

[GlobalSetup]
public void Setup()
{
_unorderedArray = Enumerable.Range(0, N).Select(_ => Random.Shared.Next()).ToArray();
_ordered = _unorderedArray.OrderBy(x => x % 2).ToArray();
_allAreOdd = Enumerable.Repeat(42, N).ToArray();
_alternating = Enumerable.Range(0, N).Select(i => i % 2 == 0 ? 42 : 777).ToArray();
}

[Benchmark]
public int Ordered() => GetEvensCount(_ordered);

[Benchmark]
public int Unordered() => GetEvensCount(_unorderedArray);

[Benchmark]
public int AllAreOdd() => GetEvensCount(_allAreOdd);

[Benchmark]
public int Alternating() => GetEvensCount(_alternating);

private static int GetEvensCount(int[] arr)
{
var evens = 0;
for (var i = 0; i < arr.Length; i++)
if (arr[i] % 2 == 0)
evens++;

return evens;
}
}


😮 Benchmark
Остортированный массив становится в 6 раз быстрее чем массив с неотсортированными числами 👨‍💻
| Method      | Mean      |
|------------ |----------:|
| Ordered | 7.897 ms |
| Unordered | 47.648 ms |
| AllAreOdd | 7.985 ms |
| Alternating | 9.585 ms |


🗿 Так что в следующий раз, когда ваш ноут/пк начнёт тупить, не переживайте — он просто пытается угадать, когда вы наконец закончите свою работу и перестанете его нагружать.

#computerscience #dotnet

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
.NET Core позволяет решить задачи несколькими путями, например вопросы конфигурации проектов.

Вообщем разработчики .NET Core стремились создать гибкую платформу, которая может адаптироваться к любым нуждам и хотелкам. Поэтому конфигурацию можно настраивать через JSON, XML, даже INI файлы, переменные среды, командную строку, базы данных и если вам этого мало вы можете сами сделать свой провайдер. Но лучше посмотреть одно видео 😎

#dotnet

📎 Ссылка: YouTube

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Как стать .NET разработчиком в 2025 году?

Я открыл .NET Core Roadmap на 2025 год и такой: "Чего? Это вообще реально освоить?" - Реально!

Первое и важное
Учитесь через практику, не пытайтесь объять всё сразу. Шаг за шагом.

Всё начинается с основ
Алгоритмы, структуры данных, ООП. Без них всё остальное – это просто набор инструментов.

Дальше экосистема .NET
ASP .NET Core - это обязательно. Blazor/MAUI - хотя бы по верхам глянуть что это.

Задачки со звёздочкой и это облака
Azure/AWS/GCP, Docker, Kubernetes – это уже не опция, а стандарт. Научитесь автоматизировать деплой, масштабировать сервисы, работать с данными – от PostgreSQL до Redis.

И конечно soft skills
умение донести идею и работать в команде сегодня так же важно, как кодить.

Звучит как план?🧙🏻‍♂️

#dotnet
#обучение

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
2🤓2😱1
Почему обновления .NET — это не опция, а необходимость

Недавно вышел релиз .NET 9.0.1 с важным исправлением уязвимости безопасности.

🟥Уязвимости могла привести к утечке данных или выполнению кода из-за неправильного управления памятью.

Казалось бы, мелочь, но для атакующего это окно возможностей, а для компаний — потенциальный риск утраты доверия пользователей, финансовые потери и ну ночи без сна 😅

Список исправленых серьёзных уязвимостей:

CVE-2025-21171 — уязвимость в десериализации JSON, позволяющая злоумышленнику выполнить произвольный код или нарушить целостность данных.
CVE-2025-21172 — проблема с некорректной проверкой входных данных, что открывает возможность для выполнения произвольного кода.
CVE-2025-21173 — ошибка в System.Data.SqlClient и Microsoft.Data.SqlClient, способная привести к утечке конфиденциальной информации.
CVE-2025-21176 — уязвимость в механизмах сериализации, где вредоносные объекты могут использоваться для выполнения произвольного кода.

Обновление доступно здесь: Microsoft .NET Updates

P.S.: Вообщем не стоит забивать и забывать про безопасность и безопасность это процесс, а НЕ одноразовое действие.

#dotnet
#security

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
История этой недели: Фантомный баг

Фантомный баг - это не ошибка, это боль. ЭТО может "поймать" кто угодно: саппорты, QA, да кто угодно.. да, но только разработчик чаще всего не ловит. И вот ты слышишь об этом баге на митингах, на звонках с ребятами, этот баг появляется и исчезает и ты не успеваешь даже понять, что это было, причём тут ты или он или они. Так вот, это прилюдие моей недели.

Пишет support: Нашли баг у клиента, он не критичный, но может повлиять на продажу продукта. По сути, он может появиться на демонстрации и сбить клиента с толку.

Ок думаю, задача будет на мне, начну делать, за одно и подождём может найдут кейс.

——

ПНД: Вижу багу, чекаю - не воспроизводится. Отправляю ответ: "it doesnot play on my side". Через пару минут прилетает видео с тем, как баг появился. Я в ответ — два видео, где бага нет. support проверяет и пишет: "Баг отсутствует!" думаю: Шах и мат вообщем (нет)

Проходит пару дней и баг снова прилетает. Проверяю, говорю: "Бага нет." Общаюсь с продактом, а он: "Да, баг был, я сам видел, но сейчас его нет". Тут я спросил "Подразумевается, что продолжаем?". Угадайте какой ответ 👍

Проверяю логи, повторяю шаги - все работает как должно. Сижу спокойно, думаю, может все в порядке... и тут пишут: "Вот, смотри, баг поймали!" Я смотрю, пробую, баг не воспроизводится -_- Делаю те же шаги от лица customer, но всё работает Ок

На сладкое добавляем: мы используем платные библиотеки

Прошло где то часов 14 подряд.
Результаты: баг появляется один раз из десяти -_-
Я пытаюсь его поймать - баг исчезает. что-где-когда происходит в реальности

На самом деле я уже верю, что кто-то написал это в либе:
if (new Random().NextDouble() < 0.05)
throw new NullReferenceException("Object reference not set to an instance of an object.");

Обсфусцировал, а теперь, я пробую найти это место и пофиксить.

- Кто не осведомлён
Этот код "обсфусцирован", это когда код изменяют так, чтобы его было сложно понять. Это делается, чтобы защититься от копирования, скрыть код или затруднить поиск ошибок - по сути защита от копирования и для запутывания (это в платных либах обычная практика). Как правило, ошибки NullReferenceException случаются, когда пытаешься работать с объектом, который не существует (т.е. NULL). В данном случае, выбрасывать это исключение случайным образом с вероятностью ~5%.

#dotnet
#bug

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
33👨‍💻1
Оптимизация, которая реально нужна

Тут наткнулся на отличное видео про оптимизацию работы с файлами и S3.
Если у вас в коде есть обработка больших файлов, то это прям мастхэв к просмотру и вдохновению

тут будет
- stackalloc – чтобы не гонять GC лишний раз.
- ArrayPool – арендуем массивы вместо создания новых.
- Stream
- работа с S3

Вместо типичного «ну, GC пусть сам разберётся», тут идёт грамотный контроль аллокаций и потоков данных. Реальный пример того, где оптимизация не просто «чтоб быстрее», а потому что надо

Советую посмотреть и вдохновиться
Ссылка: YouTube

#dotnet

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👨‍💻1
EF Core единым: как LINQ to DB спасает, когда EF уже не тянет

Есть отличное видео о ORM от Алексей Фадеев рассказал, как LINQ to DB (linq2db) может быть настоящим спасением, когда Entity Framework Core начинает тормозить — Привет от BULK операций и сложных условий обновления.

➡️ В чём EF Core не хорош?
Иногда страдает от медленной инициализации
Нет удобной поддержки bulk insert/update
Ограниченные возможности при сложных SQL-операциях

➡️ В чём linq2db хорош?
Так же не нужно создавать объект если хотите сделать просто update
просто SQL уровня UPDATE ... SET ... FROM ... WHERE ....
await db.Companies
.Where(c => c.Name == null)
.Set(c => c.Name, c => c.Director + "'s company")
.UpdateAsync();


Вставка сотен тысяч строк в linq2db: PostgreSQL и метод COPY
Если у вас PostgreSQL и вы вставляете кучу строк — забудьте про AddRange и SaveChanges 🥹
await db.BulkCopyAsync(new BulkCopyOptions
{
TableName = "Passengers",
KeepIdentity = true
}, passengersList);


Insert from select, merge и временные таблицы
LINQ to DB позволяет делать вещи, которые в EF либо невозможно, либо надо "танцевать с бубном"


Так же для MERGE можно использовать специальный DSL или выполнять кастомный SQL напрямую — и всё это в транзакции EF.
await db.Into(db.NewTable)
.Insert(
from o in db.OldTable
where o.IsActive
select new NewTable { Id = o.Id, Name = o.Name });


var sql = @"select * from tickets where departure_time > now()";
var result = await db.FromSql(sql).ToListAsync();


➡️ Что ещё интересного в linq2db?
- Использование разных isolation levels для тонкой настройки транзакций
- Обходить блокировки строк с помощью "skip locked"
- Почему EF тормозит из-за инициализации, а LINQ to DB — нет 🫠
- Как расширить LINQ to DB для PostgreSQL-специфичных фич (full-text search, @> и т.п.)

📝Итого
У меня был опыт с linq2db, но довольно печальный. Во-первых небыло ещё chatgpt)) и практически нет документации. Тем не менее, если вы работаете с большими объемами данных, сложной бизнес-логикой и хотите контролировать SQL на выходе — присмотритесь к LINQ to DB. Это не просто "альтернатива", это — швейцарский нож для разработчика, уставшего от "магии" ORM.

Ссылка: YouTube

#EFCore
#LINQtoDB
#PostgreSQL
#dotnet
Please open Telegram to view this post
VIEW IN TELEGRAM
👍521
This media is not supported in your browser
VIEW IN TELEGRAM
🪓 50 дней подряд решаю задачи на LeetCode

50-дневный стрик на LeetCode для меня было не просто. Это по сути значит, что я каждый день решал хотя бы одну задачу по алгоритмам и структурам данных. Иногда это было легко, иногда - совсем нет. Иногда — ночью, перед сном, иногда в 23:57 я пушил ответ. Но каждый день - стабильно.

➡️ Зачем это всё?
1. Набрать форму 😅.
Когда пишешь бэкенд или работаешь с продакшеном - алгоритмы быстро уходят из головы. Последний раз я решал задачи года полтора назад. И естественно ничего этого я уже и не помню). А они тренируют мышление, умение оптимизировать и видеть код на уровень глубже, не всегда конечно, но увеличивают кругозор и экспертизу.

2. Дисциплина.
Можно сранвить как спорт: это как быть в прайме своей формы или готовиться к соревнованиям, даже 20 минут в день дают мощный эффект, если делать стабильно.

3. Challenge самому себе.
Не ради рейтинга, ради алгоритмов. А ради внутреннего ощущения, что ты не стоишь на месте. И оттачиваешь своё ремесло 🤓

4. Прокачка английского.
Понять что имеется ввиду тоже ещё тот челендж


Если давно хотел прокачаться в алгоритмах, начать легко: по одной задаче в день. Главное - регулярность, это сложно.

И да, даже если день жёсткий - можно найти 10 40 минут и сделать хотя бы задачу.

Хотя бы одну задачу, Карл!

📝Итого:
Делайте себе вызовы.
Пафосно: Пусть будет не LeetCode, а что-то своё. Но что-то, что будет каждый день приближать вас к цели.

➡️ Правило от меня: Не тратить на задачу больше 1 часа. Забить и отложить. Это помогло мне пару раз

#leetcode
#codingchallenge
#developer
#dotnet

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥621
This media is not supported in your browser
VIEW IN TELEGRAM
Моё наивное решение VS. нечеловеческого?

➡️Есть задача
В массиве чисел каждый элемент - это голос за кандидата. Найдите кандидата, который получил больше половины голосов.

1. Моё решение Оказалось наивным =(
O(n) по времени, O(n) по памяти

public int MajorityElement(int[] nums)
{
var limit = nums.Length / 2;
var dict = new Dictionary<int, int>();

foreach (var number in nums)
if (dict.TryGetValue(number, out var count))
{
if (count + 1 > limit)
return number;

dict[number] = count + 1;
}
else
{
dict[number] = 1;
}

return dict[0];
}


➡️ Как работает
Мы храним количество вхождений каждого элемента в словаре.

Для каждого числа проверяем, не встречается ли оно больше половины массива.

Если встречается - сразу возвращаем его.
Да всё ок - я доволен и задача решена.

💡 НО Проблема:
Это решение работает за O(n) по времени, но требует O(n) памяти из-за использования словаря. Это неплохо, но есть более эффективные способы.

Есть нечеловеческое умное решение
2. Boyer-Moore Majority Vote Algorithm: O(n) по времени, O(1) по памяти

public int MajorityElement(int[] nums)
{
int candidate = 0, count = 0;

foreach (var num in nums)
{
if (count == 0)
candidate = num;

count += (num == candidate) ? 1 : -1;
}

return candidate;
}

➡️ Как работает
Алгоритм выбирает кандидата и отслеживает его "счёт".

Если счёт равен нулю, мы меняем кандидата на текущий элемент.

Алгоритм работает за O(n) по времени, но не требует дополнительных структур данных и O(1) по памяти 🤓

#leetcode
#dotnet
#algorithm

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2👨‍💻1
Минус одна нерешённая проблема

Вот одна из причин почему стоит учить C#

Пока философы спорят - разработчики пишут код. C# не стал спорить, а мы тут ещё 100 лет спорили, а тут всё же просто, ну 😅

#developer
#dotnet

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥22👨‍💻1
Видео по C# которое я пересматривал несколько раз 🙉

Это видос - прям топ, особенно если интересно как работает lock под капотом и не только. Если ты пишешь на .NET и думаешь что lock - это простая конструкция, типа "обернул и поехали" — ну, ты ошибаешься 😄

- Что делает lock(obj) на самом деле
- Как там внутри Monitor.Enter и вся эта магия работает
- Какие есть другие варианты кроме lock (spinlock, mutex и тд)
- Почему простой lock - это вообще не так уж и просто

Если пишешь на .NET и хочешь реально понять, как работает многопоточность и что происходит под капотом - это видео must watch. Каждый раз, когда пересматриваю, ловлю себя на новых инсайтах и что-то подмечаю 🙉🫠, особенно если копаешь в high performance или ловишь баги которые из разряда "у меня всё норм"

Видос без воды, с демками, очень технический и очень понятный (не всегда).
Реально кайф!!

📎 Ссылка: YouTube

#dotnet
#underthehood
#lock

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻2👍1
Считаешь себя молодым .NET разработчиком?


Напоминаю: Microsoft в этом году стукнуло 50 🙉
так то и .NET больше 20 😅

Так что, если ты начал писать на .NET после .NET Framework 4.0 ты буквально молодёжь 😅

📎 Ссылка:
https://www.microsoft.com/en-us/edge/microsoft-50th-anniversary



#microsoft
#dotnet

💡 Channel | Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
3👨‍💻11