Найти в Дзене
Покупайте СтеллыИ дарите их за контент
2 года назад
 • Вы подписаны

StorageS3 0.6.2

Удивительно, но библиотека соединения с Minio жива и даже используется некоторыми коллегами. И, что особенно удивительно, коллеги проявляют интерес к тому, чтобы помогать эту библиотеку разрабатывать. Каюсь, первый и единственный PR висел почти год. Уважаемый коллега, который его сделал, прости меня! Короче говоря, смерджил изменения, добавил пару правок от себя и теперь библиотекой снова можно пользоваться - она в nuget...

2 года назад
 • Вы подписаны

C# string Array.IndexOf

В комментариях заметили интересное поведение при поиске строки в массиве. Если сделать Array.IndexOf по массиву строк, то скорость получается несколько ниже простого перебора в foreach со сравнением через Equals. Было предположение, что проблема в EqualityComparer<string>.Default (который, на самом деле GenericEqualityComparer<string>), но и это оказалось не верным предположением. То есть проблема где-то в Array.IndexOf. Оказалось верным подтвержденное бенчмарком предложение,...

2 года назад
 • Вы подписаны

C# Tree<T>

Дерево - очень полезная структура данных. Помимо того, что про него спрашивают на собеседованиях, дерево помогает хранить иерархически упорядоченные данные. Например, дерево элементов HTML, дерево зависимостей сущностей в игре, дерево подразделений в компании. Имплементация дерева лаконична и проста: public class Tree<T>(Tree<T>? parent, T value) { public readonly List<Tree<T>> Children = []; public readonly Tree<T>? Parent = parent; public readonly T Value = value; public Tree<T> Add(T value) { var child = new Tree<T>(this, value); Children...

2 года назад
 • Вы подписаны

DateTime и StringBuilder

При работе со StringBuilder есть ещё одна неприятность: метод StringBuilder.Append прекрасен, но, по какой-то странной для меня причине, не имеет перегрузки для DateTime. Я знаю, что многие разработчики просто передают туда дату и... попадают на boxing, поскольку будет выбран метод с сигнатурой, принимающей object. Либо, что тоже странно, коллеги просто делают dateTime.ToString(), аллоцируя промежуточную строку и просто передавая её в StringBuilder.Append. Вроде бы ничего страшного, вроде бы очень очень маленькая аллокация...

2 года назад
 • Вы подписаны

String на stack'е

Напоминаю про чудесный ValueStringBuilder, который находится в недрах .NET и является internal. Это идеальная вещь для замены StringBuilder на коротких строках. Фактически, он является одним из распространённых подходов к написанию zero-allocation кода. Чтобы его использовать в своём приложении необходимо... просто скопировать его код из репозитория .NET. Штука до боли простая - это ref struct, которая принимает в конструктор Span<char>. Обычно его создают на стеке путём stackallock char[256]. Если в процессе создания строки выяснятся, что переданного Span не хватает - используется честный массив из ArrayPool...

2 года назад
 • Вы подписаны

Enumerator C#

Могие почему-то боятся делать перечислители (Enumerator) для своих коллекций, выставляя наружу внутренние массивы List или Dictionary. Чуть более смелые разработчики, желая сохранить инкапсуляцию, выставляют из сущностей IEnumerable или даже более правильный IReadOnlyCollection, делая свои коллекции приватными, но доступными через свойство. А вот если нам нужно что-то сделать перед передачей элемента коллекции из сущности, то добро пожаловать в LINQ: коллеги просто возвращают IEnumerable где начинают городить в возвращаемом свойстве что-то вроде _collection.Select(id => new Actor(conext, id)). Давайте не будем так делать...

Покупайте СтеллыИ дарите их за контент