Библиотека шарписта | C#, F#, .NET, ASP.NET
Все самое полезное для C#-разработчика в одном канале. Наши курсы: https://clc.to/y3LDtw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام Библиотека шарписта | C#, F#, .NET, ASP.NET
تُعد قناة Библиотека шарписта | C#, F#, .NET, ASP.NET (@csharpproglib) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 21 687 مشتركاً، محتلاً المرتبة 5 949 في فئة التكنولوجيات والتطبيقات والمرتبة 30 265 في منطقة روسيا.
📊 مؤشرات الجمهور والحراك
منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 21 687 مشتركاً.
بحسب آخر البيانات بتاريخ 31 أغسطس, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -56، وفي آخر 24 ساعة بمقدار -12، مع بقاء الوصول العام مرتفعاً.
- حالة التحقق: غير موثّقة
- معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 17.05%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 7.97% من ردود الفعل نسبةً إلى إجمالي المشتركين.
- وصول المنشورات: يحصل كل منشور على متوسط 3 698 مشاهدة. وخلال اليوم الأول يجمع عادةً 1 728 مشاهدة.
- التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 23.
- الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل .net, шарписта, навигация, await, string.
📝 الوصف وسياسة المحتوى
يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Все самое полезное для C#-разработчика в одном канале.
Наши курсы: https://clc.to/y3LDtw
По рекламе: @proglib_adv
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead”
بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 01 سبتمبر, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
class Node
{
public int Value;
public Node Left;
public Node Right;
public Node(int value)
{
Value = value;
Left = Right = null;
}
// Вставка нового значения в дерево
public void Insert(int value)
{
if (value < Value)
{
if (Left == null)
Left = new Node(value);
else
Left.Insert(value);
}
else if (value > Value)
{
if (Right == null)
Right = new Node(value);
else
Right.Insert(value);
}
}
// Поиск значения в дереве
public Node Search(int value)
{
if (value == Value)
return this;
if (value < Value && Left != null)
return Left.Search(value);
if (value > Value && Right != null)
return Right.Search(value);
return null;
}
// Обход дерева в порядке (LNR - InOrder)
public void InOrderTraversal()
{
if (Left != null)
Left.InOrderTraversal();
Console.Write(Value + " ");
if (Right != null)
Right.InOrderTraversal();
}
}
Как это работает?
1️⃣ Вставка:
• Если значение меньше текущего узла, идём в левое поддерево.
• Если больше — в правое.
• Если узел пуст, создаём новый.
2️⃣ Поиск:
• Сравниваем искомое значение с текущим.
• Меньше — идём влево, больше — вправо, равное — нашли.
3️⃣ Обход:
• In-order обход (LNR) обходит узлы в отсортированном порядке.
💬 А вы уже реализовали BST? Делитесь опытом и вопросами в комментариях!
🐸Библиотека шарпистаvar jobKey = new JobKey("MyBackgroundJob");
builder.Services.AddQuartz(q =>
{
q.AddJob<MyBackgroundJob>(opts => opts.WithIdentity(jobKey));
q.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity("MyBackgroundJob-trigger")
.WithSimpleSchedule(schedule => schedule
.WithIntervalInSeconds(10)
.RepeatForever()));
});
Пример cron-выражения — каждый день в 3 утра:
q.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity("DailyTrigger")
.WithCronSchedule("0 0 3 * * ?"));
➡️ Подробности на сайте инструмента
🐸Библиотека шарпистаdotmemory start --save-to=memory_dump.dmp
3️⃣ Ищем утечки
Используем dotMemory, чтобы определить:
• Удерживаемые объекты .
• Долгоживущие объекты, которые не очищаются сборщиком мусора.
• Утечки, связанные с событиями и подписками.
💬 Боролись с утечками памяти в контейнерах? Какие инструменты использовали? Делитесь в комментариях ⬇️
➡️ Подробности в статье
🐸Библиотека шарпистаdotnet add package ChromaDB.Client2. Подключаем Chroma в C#-коде:
using ChromaDB.Client;
var configOptions = new ChromaConfigurationOptions(uri: "http://localhost:8000/api/v1/");
using var httpClient = new HttpClient();
var client = new ChromaClient(configOptions, httpClient);
3. Создаём коллекцию и добавляем данные:
var collection = await client.GetOrCreateCollection("movies");
var collectionClient = new ChromaCollectionClient(collection, configOptions, httpClient);
Chroma DB C# SDK — ещё один шаг к тому, чтобы .NET-разработчики легко создавали мощные AI-приложения.
➡️ Подробнее в блоге разработчиков
🐸Библиотека шарпистаvar result = dbContext.Orders
.GroupBy(o => o.CustomerId)
.OrderBy(g => g.Key)
.Select(g => new { CustomerId = g.Key, TotalOrders = g.Count() })
.ToList();
Такой код работал в предыдущих версиях EF, но теперь выбрасывает исключение.
➖ Как исправить
Можно принудительно выполнить запрос перед сортировкой, чтобы GroupBy обрабатывался в памяти:
var result = dbContext.Orders
.GroupBy(o => o.CustomerId)
.Select(g => new { CustomerId = g.Key, TotalOrders = g.Count() })
.ToList() // Выполняем в памяти
.OrderBy(g => g.CustomerId) // Теперь сортируем
.ToList();
Ошибка, вероятнее всего, будет исправлена в Entity Framework 10.
➡️ Суть проблемы в оригинале
🐸Библиотека шарпистаclass LSMTree
{
private SortedDictionary<string, string> memTable = new();
private const string WAL_FILE = "wal.log";
public LSMTree()
{
LoadFromWAL();
}
public void Put(string key, string value)
{
memTable[key] = value;
File.AppendAllText(WAL_FILE, $"{key}:{value}\n");
}
public string Get(string key)
{
return memTable.TryGetValue(key, out var value) ? value : "Not found";
}
private void LoadFromWAL()
{
if (File.Exists(WAL_FILE))
{
foreach (var line in File.ReadAllLines(WAL_FILE))
{
var parts = line.Split(':');
if (parts.Length == 2)
memTable[parts[0]] = parts[1];
}
}
}
}
➖Где используется
• NoSQL базы данных: LevelDB, RocksDB, Cassandra
• Поисковые системы: Elasticsearch, Apache Lucene
• Хранилища для логов и кэшей
➖ Преимущества LSM-дерева
• Быстрая запись – все изменения сначала пишутся в память
• Эффективное хранение – используется сжатие и компактификация
• Масштабируемость – отлично работает при больших объёмах данных
➖ Но есть нюансы
• Медленный поиск — требуется слияние уровней
• Утилизация ресурсов — периодическая компактификация требует CPU
🔗 Как вы храните данные в своих проектах? Делитесь в комментариях! ⬇️
🐸Библиотека шарпистаclass Graph {
private int V;
private List<int>[] adj;
public Graph(int v) {
V = v;
adj = new List<int>[v];
for (int i = 0; i < v; i++)
adj[i] = new List<int>();
}
public void AddEdge(int v, int w) {
adj[v].Add(w);
}
public void DFS(int start) {
bool[] visited = new bool[V];
DFSUtil(start, visited);
}
private void DFSUtil(int v, bool[] visited) {
visited[v] = true;
Console.Write(v + " ");
foreach (int n in adj[v]) {
if (!visited[n])
DFSUtil(n, visited);
}
}
}
🐸Библиотека шарпистаusing NUnit.Framework;
namespace MyProject.Tests;
[TestFixture]
public class CalculatorTests
{
private Calculator _calculator;
[SetUp]
public void Setup()
{
_calculator = new Calculator();
}
[Test]
public void Add_WhenCalled_ReturnsSum()
{
int result = _calculator.Add(2, 3);
Assert.That(result, Is.EqualTo(5));
}
}
Пара советов по эффективному тестированию:
• Изолируйте тесты: используйте [SetUp] и [TearDown] для подготовки и очистки данных.
• Избегайте зависимостей: мокируйте внешние сервисы с помощью Moq или NSubstitute.
📎 Подробные примеры кода
💬 Делитесь в комментариях своим опытом работы с NUnit
🐸Библиотека шарписта