Как получить уникальные значения без ручных проверок?
Часто нужно убрать дубликаты: имена пользователей, id, теги.
Иногда для этого пишут такую конструкцию:
Это работает, но в
Гораздо проще (и читабельнее) использовать готовые инструменты:
Для LINQ — Distinct()
Она сама уберёт дубли и вернёт последовательность уникальных значений:
Для максимальной скорости — `HashSet`
🔥 Итог: когда нужны уникальные значения — начинай с
➡️ C# Ready | #совет
Часто нужно убрать дубликаты: имена пользователей, id, теги.
Иногда для этого пишут такую конструкцию:
if (!list.Contains(x))
list.Add(x);
Это работает, но в
Contains список просматривается каждый раз — чем больше данных, тем медленнее. Да и выглядит это как “велосипед”.Гораздо проще (и читабельнее) использовать готовые инструменты:
Для LINQ — Distinct()
Она сама уберёт дубли и вернёт последовательность уникальных значений:
var unique = names.Distinct().ToList();
Для максимальной скорости — `HashSet`
HashSet<T> из коробки хранит только уникальные элементы, без повторов:var set = new HashSet<string>(names);
Distinct() или HashSet. Меньше ручных проверок, меньше кода, и алгоритм сразу читается как правило: *“здесь храним только уникальные элементы”*.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍9❤8
This media is not supported in your browser
VIEW IN TELEGRAM
Если обычные видеоуроки не заходят и хочется больше практики — Scrimba решает эту задачу. Здесь обучение построено так, что ты не просто смотришь объяснение, а сразу работаешь с кодом прямо в уроке: меняешь примеры, запускаешь и смотришь результат. На платформе есть множество языков и технологий.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤8🔥7
Поставлю себе цель: набрать более 20 тысяч подписчиков. Желаю каждому выполнить планы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27❤12👍9
Как сравнивать строки без сюрпризов от локали?
Частая привычка — приводить строки к одному регистру и сравнивать:
Но это:
• делает лишние аллокации (создаёт новые строки),
• может зависеть от текущей культуры (локали) и давать неожиданные результаты.
Правильнее — сравнивать строки с явным режимом:
А если нужно “по-человечески” (для отображения пользователю) — тогда уместнее
🔥 Итог: меньше аллокаций, предсказуемое сравнение и код, который сразу говорит: “сравниваем без учёта регистра — и точка”.
➡️ C# Ready | #совет
Частая привычка — приводить строки к одному регистру и сравнивать:
a.ToLower() == b.ToLower()
Но это:
• делает лишние аллокации (создаёт новые строки),
• может зависеть от текущей культуры (локали) и давать неожиданные результаты.
Правильнее — сравнивать строки с явным режимом:
string.Equals(a, b, StringComparison.OrdinalIgnoreCase)
StringComparison.OrdinalIgnoreCase — самый безопасный вариант для технических строк: ключей, логинов, кодов, файлов, заголовков, команд.А если нужно “по-человечески” (для отображения пользователю) — тогда уместнее
CurrentCultureIgnoreCase, но это уже другое правило.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤11👍7
Как перестать писать ContainsKey + индексатор (и не искать ключ дважды)?
Частая ошибка при работе с
• делает два поиска по словарю,
• легко превращается в баг, если кто-то забудет проверку и оставит просто
Вместо этого используй
А если тебе нужно “дай значение или дефолт” — ещё проще:
🔥 Итог: меньше лишних проверок и двойных обращений к словарю, ниже шанс словить
➡️ C# Ready | #совет
Частая ошибка при работе с
Dictionary — сначала проверить ContainsKey, а потом взять значение через dict[key]. Это:• делает два поиска по словарю,
• легко превращается в баг, если кто-то забудет проверку и оставит просто
dict[key].Вместо этого используй
TryGetValue — он и проверяет наличие ключа, и достаёт значение за один проход:var count = dict.TryGetValue(key, out var value) ? value : 0;
А если тебе нужно “дай значение или дефолт” — ещё проще:
var count = dict.GetValueOrDefault(key, 0);
KeyNotFoundException, а код читается как правило: “если ключа нет — верни 0”.Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥6❤4
required свойства: компилятор заставит заполнить поля!
Часто в коде создают объекты, забывая заполнить важные свойства. Ошибка всплывает поздно — где-то в рантайме, когда поле внезапно
Обычно это выглядит так:
И получаем проблему уже при использовании:
В C# 11 можно пометить обязательные свойства как
🔥
➡️ C# Ready | #практика
Часто в коде создают объекты, забывая заполнить важные свойства. Ошибка всплывает поздно — где-то в рантайме, когда поле внезапно
null.Обычно это выглядит так:
class UserDto
{
public string Name { get; set; }
public string Email { get; set; }
}
var user = new UserDto
{
Name = "Анна"
// Email забыли…
};
И получаем проблему уже при использовании:
Console.WriteLine(user.Email.Length); // NullReferenceException
В C# 11 можно пометить обязательные свойства как
required — и компилятор не даст создать объект без них:class UserDto
{
public required string Name { get; init; }
public required string Email { get; init; }
}
var user = new UserDto
{
Name = "Анна",
Email = "anna@mail.com"
};
required + init = безопасная инициализация: меньше сюрпризов в рантайме, больше контроля на этапе компиляции.Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤6🔥4
На картинке — аккуратная “C# Cheat Sheet”, которая помогает быстро вспомнить основы языка: как писать комментарии, работать с перечислениями
enum, использовать циклы for, while и foreach, объявлять и использовать пространства имён, создавать объекты и вызывать методы, а также понимать, как работают делегаты и события в C#.Сохрани, чтобы код на C# стал проще и понятнее
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🔥6👍5👎1
В этой шпаргалке — практичный разбор, чем отличаются эти два подхода в async-коде: как быстро вернуть готовый результат, где ValueTask экономит аллокации, почему иногда лучше конвертировать в Task и как не поймать неожиданные проблемы с повторным ожиданием.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20❤5👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Хочешь быстро понять, чем Python отличается от C#, Rust, C++ или Go. Здесь синтаксис, структура, идиомы и концепции разных языков сравниваются в таблицах, так что можно буквально увидеть, как одна и та же задача решается на разных языках. Это отличный способ прокачать мультиязычное мышление, выбрать язык под задачу или просто пронаблюдать сходства и различия.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍7🔥6
Как не лепить try/catch вокруг int.Parse()?
Когда число приходит из UI, JSON, CSV или внешней системы — оно может быть пустым, кривым или с пробелами. Если парсить через
Вместо этого используй
А если при невалидном вводе нужно просто выйти — делай guard clause (код читается сверху вниз, без лишних
🔥 Меньше шума и вложенности, никаких исключений “для контроля потока”, проще обработка пользовательского ввода и меньше шансов словить неожиданный крэш на проде.
➡️ C# Ready | #совет
Когда число приходит из UI, JSON, CSV или внешней системы — оно может быть пустым, кривым или с пробелами. Если парсить через
int.Parse, приходится оборачивать всё в try/catch, и исключения превращаются в “обычный сценарий”.Вместо этого используй
TryParse: он возвращает true/false и не кидает исключения на невалидном вводе:var age = int.TryParse(input, out var parsed) ? parsed : 0;
А если при невалидном вводе нужно просто выйти — делай guard clause (код читается сверху вниз, без лишних
else):if (!int.TryParse(input, out var age)) return;
SaveAge(age);
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥7❤5
В этой статье:
• Поймёшь, как объект выделяется в куче и размечается CLR• Увидишь, где берутся заголовок, таблица методов и поля объекта• Разберёшь, что реально ускоряет создание и где ломаются мифы🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤3👍3
List patterns в C# 11: проверяем массивы и списки без if-каши!
Иногда нужно быстро понять, что лежит в коллекции: пустая ли она, с чего начинается, чем заканчивается, есть ли конкретная “форма” данных.
Раньше это превращалось в проверки Length и индексов:
Чем больше условий, тем быстрее это разрастается и становится трудно читать.
В C# 11 появились list patterns, которые позволяют матчить коллекцию прямо по её “форме”:
Здесь
🔥 В итоге вместо проверок длины и индексов ты пишешь условия так, как думаешь о данных: по форме коллекции.
➡️ C# Ready | #практика
Иногда нужно быстро понять, что лежит в коллекции: пустая ли она, с чего начинается, чем заканчивается, есть ли конкретная “форма” данных.
Раньше это превращалось в проверки Length и индексов:
int[] numbers = { 0, 5, 7, 10 };
if (numbers.Length == 0)
Console.WriteLine("Пусто");
else if (numbers.Length >= 1 && numbers[0] == 0)
Console.WriteLine("Начинается с 0");
else if (numbers.Length >= 1 && numbers[^1] == 10)
Console.WriteLine("Заканчивается на 10");
else if (numbers.Length == 3 && numbers[2] == 10)
Console.WriteLine("Третий элемент = 10");
else
Console.WriteLine("Другая форма");Чем больше условий, тем быстрее это разрастается и становится трудно читать.
В C# 11 появились list patterns, которые позволяют матчить коллекцию прямо по её “форме”:
int[] numbers = { 0, 5, 7, 10 };
var result = numbers switch
{
[] => "Пусто",
[0, ..] => "Начинается с 0",
[.., 10] => "Заканчивается на 10",
[_, _, 10] => "Третий элемент = 10",
_ => "Другая форма"
};
Console.WriteLine(result);Здесь
_ означает “любой элемент”, а .. означает “любое количество элементов” между ними.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥30👍10❤5
На картинке — насыщенная и компактная памятка по ключевым возможностям языка C#: работа с компилятором из командной строки, базовый синтаксис и управляющие конструкции, циклы и условия, описание классов, методов и свойств, а также делегаты, события, структуры и перечисления.
Сохрани, чтобы держать под рукой основу C# и быстрее ориентироваться при разработке и подготовке к собеседованиям.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤5👍3
params удобен, но часто создаёт временный массив — в горячем коде это лишние аллокации и нагрузка на GC. Есть простой трюк: принимать ReadOnlySpan<T> и передавать набор значений без new.В этом посте:
• Поймём, почему params может незаметно создавать массивы;
• Посмотрим, как заменить это на ReadOnlySpan<T> и stackalloc;
• Разберём ограничения Span и где его нельзя использовать.
После гайда вы сможете делать такие “мелкие” оптимизации там, где они реально дают прирост — без усложнения логики и без магии.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20❤4👍3