• Как передать динамический текст в switch-case?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    switch (path)
    {
        case not null when string.Equals($"{context.Culture}/some-page", path):
            break;
    }
    Ответ написан
    Комментировать
  • Стотит ли менять asp.net mvc на asp.net web api + nextjs?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    нормально себя чувствует.

    Работает и не трогай
    Ответ написан
    3 комментария
  • Как отсортировать вложенные друг в друга объекты?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    В голову приходит схема сортировки тройки (id родителя; id потомка; название):
    - id родителя - id узла-родителя, может быть null
    - id потомка - id любого узла-потомка, может быть null
    - название - это поле Name (скорее всего сортировка по нему нужна)

    И тогда сравнение будет по соответствующим элементам тройки.
    Причем, id родителя и id потомка могут быть null и в таком случае сравнение будет null first (т.е. null больше) и null last (т.е. null меньше) для id родителя и id потомка соответственно. А если равны, то уже по имени (Name) сравниваем.
    Вроде бы условия соблюдаются:
    - Без родителя первый: id родителя = null - больший вес при сравнении
    - Самый последний - объект без дочерних элементов: id потомка = null - больший вес при сравнении
    - Дальше по убыванию к дочерним: id - можно как числа сравнивать

    P.S. "дальше по убыванию, к дочерним" не совсем понял, что имеется ввиду
    Ответ написан
    Комментировать
  • Как правильно возвращать значение из геттера?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Полностью зависит от контекста. Здесь нет правильного ответа.
    Можно выделить 2 случая:
    1. Код полностью твой
    2. Код будут использовать другие пользователи

    Если случай 1, то делай как хочешь. Здесь ты главный и знаешь что менять можно, а что нет
    Если случай 2, то тут уже зависит:
    - Если возвращаешь объект, который может (и должен) быть изменен - делай изменяемым
    - Если это слепок состояния - то можно подумать над неизменяемым состоянием
    - Можно прописать это (то что нельзя изменять объект) в документации к методу геттера

    Дополнительно, если тебе так уж нужна неизменяемость, то добавляй интерфейсы. Возвращай какой-нибудь интерфейс с одними геттерами.
    Ответ написан
    Комментировать
  • В чём отличие между middleware и фильтрами в .Net?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Middleware - это часть ASP.NET Core. Они занимаются обработкой HTTP запроса, могут его изменять/дополнять. Например, производить авторизацию или, если запрос пришел от прокси, то разворачивать отображать HTTP заголовки
    Фильтры - это часть MVC, фреймворка внутри ASP.NET Core. Т.е. они часть контроллеров и предназначаются только для них, но могут работать и как Middleware (HttpContext поле доступно). Дополнительно, у них есть иерархия вызовов, в зависимости от типа фильтра, а middleware вызываются каждая и в зависимости от порядка их регистрации
    Ответ написан
    2 комментария
  • Где можно посмотреть официальную статистику популярности операционных систем Linux?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ответ написан
    Комментировать
  • Как получить Text из созданного через код элемента Textbox в WPF C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Эти TextBox как-то появляются. Причем они появляются динамически, т.е. создаются из кода.
    Поэтому когда создаешь новые TextBox, то сохраняй их в какое-нибудь поле (например, List<TextBox>) и работай с ними через это поле.
    Ответ написан
    3 комментария
  • Как связать grpc message з MediatR?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Почему не сделать отдельный IRequest, у которого единственное поле - этот массив байтов модели?
    Либо при получении этого массива делай его парсинг и создавай отдельный, готовый класс модели IRequest
    Ответ написан
  • В чем отличия jetbrains dotTrace и clrstack?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    dotTrace - полноценная утилита для профилирования приложений, нахождения горячих точек. В общем платный и удобный инструмент. Можно сказать, что это полноценная "IDE" для профилирования, которая может подсказать проблемы
    clrstack - это уже консольная утилита, для визуализации уже снятого дампа стека (дамп снять можно через dotnet dump). Тут работа через консоль (менее наглядно, возможно чем через GUI на dotTrace), но бесплатно. В сравнении с dotTrace, это уже просто небольшая тулза, которая облегчит профилирование, но всякие выводы должен делать уже сам (нет подсказок каких-то)

    UPD: clrstack вроде как только для windows судя по исходникам
    Ответ написан
    4 комментария
  • Почему 0,5 округляется до чётного числа?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Округляет до четного, потому что так написано в документации к функции:

    The integer nearest a. If the fractional component of a is halfway between two integers, one of which is even and the other odd, then the even number is returned. Note that this method returns a Double instead of an integral type.


    Если нужное другое округление, то есть перегрузки:
    Math.Round(4.5, MidpointRounding.ToEven);
    Math.Round(4.5, MidpointRounding.ToZero);
    Math.Round(4.5, MidpointRounding.AwayFromZero);
    Math.Round(4.5, MidpointRounding.ToNegativeInfinity);
    Math.Round(4.5, MidpointRounding.ToPositiveInfinity);
    Ответ написан
    2 комментария
  • Хорошая ли идея создавать БД на стороне клиентской части (фронтенда)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Зависит от многих факторов:
    1. Если это полноценное офлайн приложение:
    - Если необходима полноценная СУБД (SQL Server, Postgres, MySql) - то нет. Мало кто захочет дополнительно себе устанавливать такие тяжелые зависимости, они всегда могут ее удалить и тогда уже не восстановить, обновления ПО либо не будут возможны, либо трудны
    - Если это встраиваемая СУБД (SQLite) - то вполне да, так многие приложения делают (на андроиде слышал SQLite часто используют)
    2. Если это онлайн приложение в браузере:
    - localStorage - это key/value хранилище
    - web sql - устаревшая технология
    - куки - могут пропасть в любое время
    3. Если это корпоративные клиенты, то можно навязать им свои требования по необходимости запуска СУБД на каждой машине

    Тут все зависит от того, что под БД подразумевается и для каких целей это нужно

    UPD: SQL запросы из клиента напрямую в БД - очень плохая идея, не надо так (обновления, безопасность, гибкость и т.д. - все постарадает)
    Ответ написан
    4 комментария
  • Cannot convert return expression of type, C# generic method, как вернуть конкретный тип?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    как можно вернуть конкретный тип значения без изменения сигнатуры?

    В данном случае - никак.
    T - это generic параметр для подстановки во время компиляции. Он означает конкретный тип.
    Так как никаких ограничений на него не выставлено, то считается, что может в него быть вставлено абсолютно что-угодно. Но возвращаемые значения должны уметь конвертироваться в этот возвращаемый тип, например, если T - long, то ParseInt сработает, т.к. int конвертируется к long (неявно и явно), а DateTime к long просто так нет. А теперь вместо T подставь byte или какой-нибудь класс и подумай - можно ли int к этому классу сконвертировать.

    Пишу парсер

    Когда я писал свой парсер, то делал базовый класс с абстрактным свойством, которое показывает что это за тип, и для каждого возможного значения - отдельный класс, который наследуется от базового. Чтобы понимать, что в результате пришло - смотрю на это поле.

    Дополнительно, в данном случае лучше применять какую-нидудь фабрику этих парсеров, т.к. в рантайме через рефлексию определять свой тип и на основании него парсить - такое себе.

    Например, так можно

    enum TokenType
    {
        Int,
        Decimal,
        DateTime,
    }
    
    public abstract class ParseResult
    {
          public abstract TokenType Type { get; }
    }
    
    public class IntParseResult: ParseResult
    {
           public override TokenType Type => TokenType.Int;
           public int Value { get; }
           IntParseResult(int value)
           {
                 Value = value;
            }
    }
    
    public class DecimalParseResult: ParseResult
    {
           public override TokenType Type => TokenType.Decimal;
           public decimal Value { get; }
           DecimalParseResult(decimal value)
           {
                 Value = value;
            }
    }
    
    public class DateTimeParseResult: ParseResult
    {
           public override TokenType Type => TokenType.DateTime;
           public DateTime Value { get; }
           DateTimeParseResult(DateTime value)
           {
                 Value = value;
            }
    }
    
    public interface IParser
    {
              ParseResult Parse(string str);
    }
    
    public class IntParser: IParser
    {
            public ParseResult Parse(string str) => ParseInt(str);
    }
    
    public class DecimalParser: IParser
    {
            public ParseResult Parse(string str) => ParseDecimal(str);
    }
    
    public class DateTimeParser: IParser
    {
            public ParseResult Parse(string str) => ParseDateTime(str);
    }
    
    public static class MyParser
       {
           private static IParser GetParserFor(string str) { /* .... */ };
           public static ParseResult Parse(string str)
           {
                  var parser = GetParserFor(str);
                  return parser.Parse(str);
           }
       }


    Я рекомендую убрать этот статический парсер и вынести решение о том какой парсер использовать выше по иерархии вызовов, либо пересмотреть логику парсинга, т.к. просто посмотреть на строку и понять как парсить - не самое эффективное решение.
    Ответ написан
    Комментировать
  • Есть ли open-source Bash скрипты, позволяющие собирать информацию с серверов?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    node-exporter
    В конфиге экспортера выставляешь, что нужно собирать
    Любым скриптом делаешь http запрос на сервер и получаешь эту инфу
    Ответ написан
    Комментировать
  • WPF ошибка CS0103?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Класс помечен partial - проверь что оба объявления находятся в одном и том же неймспейсе что и в XAML разметке (тот что x:Class).
    Вот тут на SO похожая проблема - https://stackoverflow.com/questions/6925584/the-na...
    Ответ написан
  • Персонаж не прыгает в unity3D! Почему?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Вместо Input.GetButtonDown("Jump") используй Input.GetKeyDown(KeyCode.Space)
    Ответ написан
  • Какие есть бинарный сериализаторы для React?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Protobuf - https://github.com/protobufjs/protobuf.js
    Avro - https://github.com/mtth/avsc
    Parquet - https://github.com/ironSource/parquetjs (проект давно не обновлялся)
    Thrift - https://thrift.apache.org/tutorial/js

    P.S. React или нет без разницы - тут js главное
    Ответ написан
    Комментировать
  • Можно ли всем строковым полям задавать тип TEXT и повлияет ли это сильно на производительность?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Судя по этой статье можно всегда использовать TEXT вместо CHAR(N) и VARCHAR(N), т.к. производительность особо не страдает.

    А если самому пойти в документацию, то можно увидеть следующее:
    There is no performance difference among these three types, apart from increased storage space when using the blank-padded type, and a few extra CPU cycles to check the length when storing into a length-constrained column. While character(n) has performance advantages in some other database systems, there is no such advantage in PostgreSQL; in fact character(n) is usually the slowest of the three because of its additional storage costs. In most situations text or character varying should be used instead.

    Т.е. в производительности разницы нет - только в стоимости хранения. (в отличие от других СУБД)
    Ответ написан
    5 комментариев
  • Какой шаблон проекта выбрать при написании телеграмм бота Visual Studio 2022?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для простого телеграм бота подойдет и консольное.
    ASP.NET Core/Web.API - точно нет, т.к. они для веб-приложений, у тебя не такое.
    Также может подойти шаблон Worker Service, но он больше для каких-то сложных приложений.

    Предлагаю пока остановиться на консольном, но параллельно изучать Worker Service, т.к. в нем много удобных вещей - логирование, обработка исключений, мониторинг, DI и т.д.
    Возможно, однажды пригодится, но пока оставайся на консоли.
    Ответ написан
    2 комментария
  • Есть ли хороший курс/книга про использование паттерна page object на C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Курс/книга ради одного паттерна - вряд ли можно найти хорошие.
    Page Object паттерн из GUI тестирования, поэтому искать там. Рекомендую курс от Selenium - https://www.seleniumtraining.com/selenium-c-sharp-...
    Там как раз есть 6 часовой туториал с проектом по Page Object, но он в платной подписке.

    Также по тестированию на C# есть книга Selenium with C# - в 12 главе описывается Page Object

    Есть статья на хабре, но думаю она только описывает этот паттерн, только для знакомства
    Ответ написан
    1 комментарий
  • Почему цикл for блокирует асинхронное выполнение программы?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Ключевое слово await заставляет ожидать завершения всей функции и только потом происходит переход к следующей итерации.
    Если использовать asyncio.create_task, то создается и запускается фоновая задача - цикл продолжается после запуска этой асинхронной функции и не ждет ее завершения.

    хотя в функции pool_user нет ничего, что могло бы блокировать асинхронный цикл

    Во-первых, там есть подключение if await user.connect()
    Во-вторых, ты отправляешь сообщение если подключиться не удалось await bot.send_message

    Но в любом случае ты постоянно делаешь подключение, которое и блокирует выполнение функции
    Ответ написан
    3 комментария