Библиотека шарписта | C#, F#, .NET, ASP.NET
Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Показати більше📈 Аналітичний огляд Telegram-каналу Библиотека шарписта | C#, F#, .NET, ASP.NET
Канал Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 21 705 підписників, посідаючи 5 953 місце в категорії Технології та додатки та 30 278 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 21 705 підписників.
За останніми даними від 28 серпня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -37, а за останні 24 години на 5, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 16.02%. Протягом перших 24 годин після публікації контент зазвичай збирає 7.85% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 3 478 переглядів. Протягом першої доби публікація в середньому набирає 1 705 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 26.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як .net, шарписта, навигация, await, string.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Все самое полезное для C#-разработчика в одном канале.
Наши курсы: https://clc.to/y3LDtw
По рекламе: @proglib_adv
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead”
Завдяки високій частоті оновлень (останні дані отримано 29 серпня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
2n в виде [x1,x2,xn,y1,y2,yn] нужно вернуть массив [x1,y1,x2,y2,xn,yn], то есть перемешать.
Идея решения
Логически делим массив на две половины по n элементов и в одном цикле по индексу i собираем ответ в новый массив result.
На каждой итерации кладем сначала элемент из первой половины nums[i] потом из второй nums[i+n].
Так мы проходим вход один раз время O(n), где n это половина массива.
Решение:
public class Solution
{
public int[] Shuffle(int[] nums, int n)
{
int[] result = new int[2 * n];
int index = 0;
for (int i = 0; i < n; i++)
{
result[index++] = nums[i];
result[index] = nums[i + n];
index++;
}
return result;
}
}
Ключевой момент в том что мы никогда не выходим за границы
первая половина идет по индексам от нуля до n минус один вторая от n до 2n минус один, а индекс в result просто сдвигается на два шага за итерацию.
➡️ Попробовать решить
🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸Библиотека шарписта
#dotnet_challengeVectors & Matrices: операции, ранги, СЛАУ;
— Linear Regression: реализация МНК, интерпретация весов;
— SVD: матричные разложения и рекомендательные системы.
Практика на Python (NumPy), но алгоритмическая суть переносится на любой язык.
Регистрация закрывается 9 декабря:
https://clc.to/LojFzwawait db.SaveChangesAsync(ct);
Переданный CancellationToken позволяет прервать выполнение метода, если операция была отменена.
🔹 Математика для Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸Библиотека шарписта
#sharp_viewAddAsKeyed() — новый метод расширения для регистрации именованных HttpClient как Keyed Service в DI. Имя клиента становится ключом, по которому можно получать конкретный экземпляр.
• Внедрение осуществляется с помощью атрибута [FromKeyedServices("key")] или через Func<string, HttpClient> для динамического выбора клиента по ключу.
• В отличие от старых подходов с именованными или типизированными клиентами, внедрение зависимостей по ключам позволяет упростить код и уменьшить лишние вызовы фабрики IHttpClientFactory.
Пример регистрации и использования:
var builder = WebApplication.CreateBuilder(args);
// Регистрация HttpClient с ключом "github"
builder.Services.AddHttpClient("github", c =>
{
c.BaseAddress = new Uri("https://api.github.com/");
c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
c.DefaultRequestHeaders.Add("User-Agent", "dotnet");
})
.AddAsKeyed();
var app = builder.Build();
// Внедрение HttpClient по ключу "github"
app.MapGet("/", ([FromKeyedServices("github")] HttpClient httpClient) =>
{
return httpClient.GetFromJsonAsync<Repo>("/repos/dotnet/runtime");
});
app.Run();
record Repo(string Name, string Url);
Преимущества Keyed DI
• Минимизирует необходимость вручную создавать и хранить экземпляры через IHttpClientFactory.
• Позволяет внедрять в сервисы и контроллеры правильно настроенные клиенты с простым указанием ключа.
• Улучшает читаемость и поддержку кода, особенно если в проекте много разных конфигураций HttpClient.
• Можно глобально включить ключевой DI для всех клиентов через ConfigureHttpClientDefaults.
Важные моменты
• По умолчанию AddAsKeyed() регистрирует HttpClient с областью видимости Scoped, но можно настроить и другой жизненный цикл.
• Нужно внимательно следить за временем жизни сервисов, чтобы избежать утечек памяти и проблем с соединениями.
• При ошибочном использовании ключа сервис выдаст стандартное исключение, помогая быстро находить и исправлять конфигурационные ошибки.
🔹 ML для старта в Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸Библиотека шарписта
#il_люминаторand! в вычислительном выражении task.
Раньше, чтобы ждать несколько задач параллельно, нужно было либо ждать их последовательно:
task {
let! a = fetchA()
let! b = fetchB()
return combineAB a b
}
Либо использовать Task.WhenAll для ожидания сразу всех:
task {
let ta = fetchA()
let tb = fetchB()
let! results = Task.WhenAll([| ta; tb |])
return combineAB ta.Result tb.Result
}
Первый вариант простой, но последовательный, второй — параллельный, но сложнее по синтаксису.
Теперь с оператором and! можно одновременно ждать несколько задач легко и понятно:
task {
let! a = fetchA()
and! b = fetchB()
return combineAB a b
}
Это сочетает простоту первого примера с параллельным исполнением из второго. Код становится компактным и выразительным.
🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸Библиотека шарписта
#sharp_viewAsNoTracking():
var posts = await db.Posts.AsNoTracking()
.Where(p => p.Published)
.ToListAsync(ct);
Метод AsNoTracking() говорит Entity Framework не отслеживать изменения для полученных объектов.
🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸Библиотека шарписта
#sharp_viewIAgeSignalService и трёх платформо-специфичных реализаций:
• Для Android используется Google Play Age Signals API, который возвращает пять статусов в зависимости от ситуации: от подтверждённого возраста до ожидания одобрения опекуна.
• На iOS применяется Apple Declared Age Range API, работающий на устройствах с iOS 26 и выше, отображающий возрастной диапазон и информацию о том, кто его подтвердил — сам пользователь или опекун.
• Windows предлагает Windows Age Consent API с упрощённой классификацией пользователей на три категории: ребёнок, несовершеннолетний и взрослый.
Главное преимущество — единая точка интеграции и адаптация под каждый API за счёт условной компиляции и инъекции зависимостей. Достаточно подключить сервис в MauiProgram, чтобы обеспечить проверку возраста на нужной платформе.
➡️ Блог Microsoft
🔹 AI-агенты для DS-специалистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸Библиотека шарписта
#sharp_view(), и тесты не запускались
• Атрибуты-анализаторы иногда игнорировались, приводя к сбоям в CI без очевидной причины.
Пример такого кода, который никак не работал:
[<Fact>]
let ``this is not a function`` = // никак не запускался тест
Assert.True(false)
Теперь компилятор выдаёт предупреждение при неверном применении атрибутов:
[<Fact>]
//^^^^ предупреждение FS0842: атрибут нельзя применять к свойству, полю и т.п.
let ``works correctly`` =
Assert.True(true)
Атрибуты должны применяться только к совместимым элементам, например, к методам.
🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸Библиотека шарписта
#sharp_viewvar dto = await db.Users
.Where(u => u.Id == id)
.Select(u => new UserDto(u.Id, u.Name))
.SingleOrDefaultAsync(ct);
Здесь из таблицы пользователей выбираются только Id и Name, которые помещаются в объект UserDto.
🔹 ML для старта в Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸Библиотека шарписта
#il_люминатор{ 1..10 } |> List.ofSeq // неявная последовательность
Это была особенность синтаксиса, но она расходилась с остальными вычислительными выражениями в языке и могла сбивать с толку.
Теперь компилятор рекомендует явно писать seq, чтобы сделать код однозначным и понятным:
seq { 1..10 } |> List.ofSeq
Сейчас это предупреждение, а не ошибка, чтобы дать время адаптироваться и исправить код. Но в будущих версиях F# это может превратиться в ошибку.
🔸 AI-агенты для DS-специалистов
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
🐸 Библиотека шарписта
#sharp_viewpublic class Solution {
private static readonly string[] map = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
public IList<string> LetterCombinations(string digits) {
var result = new List<string>();
if(string.IsNullOrEmpty(digits))
return result;
Backtrack(digits, 0, new StringBuilder(), result);
return result;
}
private void Backtrack(string digits, int index, StringBuilder current, List<string> result) {
if(index == digits.Length) {
result.Add(current.ToString());
return;
}
string letters = map[digits[index] - '0'];
foreach(char c in letters) {
current.Append(c);
Backtrack(digits, index + 1, current, result);
current.Length--;
}
}
}
🔸 ML для старта в Data Science
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
🐸Библиотека шарписта
#dotnet_challengetype U =
| A
| B
module M = // на самом деле не вложенный модуль
let f () = ()
Правильный код:
type U =
| A
| B
module M =
let f () = ()
Это предотвращает частую ошибку, когда модуль кажется «вложенным» в тип, но на самом деле не является таковым.
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib
🐸Библиотека шарписта
#sharp_view