Ответы пользователя по тегу C#
  • Какое решение задачи по циклам будет правильным?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. Определяемся с тем, что от нас хотят. Требования можно представить в виде такого псевдокода :)
    повторять всегда {
       сообщение = прочитать();
       если сообщение = "EXIT" то выйти;
       сообщение2 = прочитать();
       если сообщение2 = "EXIT" то выйти;
       количество_повторений = прочитать_число(сообщение2);
       повторять количество_повторений раз {
         напечатать(сообщение);
       }
    }


    2. Переводим буквально на C#:
    while(true) {
      Console.WriteLine("Введите сообщение");
      var message = Console.ReadLine();
      if (message == "EXIT") {
        return;
      }
      Console.WriteLine("Введите количество повторений");
      var message2 = Console.ReadLine();
      if (message == "EXIT") {
        return;
      }
      var count = int.Parse(message2); // по хорошему, надо бы как-нибудь обработать, если пользователь ввёл не число. В таком виде программа просто упадёт.
      for(var i=0; i<count; i++) {
        Console.WriteLine(message);
      }
    }
    Ответ написан
    Комментировать
  • Как сделать картинку размером более 100000 пикселей(png)?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Битмап такой размер сделать не может.

    а затем редактировать её классом битмап?

    У тебя тут взаимоисключающие тезисы. Так что никак :)

    1. Учитывай, что такая "картинка" будет весить 232гб (для манипуляций с картинкой её надо распаковать), так что продуктивнее будет её разрезать на N тайлов чуть меньшего размера. Хотябы по 16к*16к пикселей
    2. Ты можешь взять ImageSharp(https://sixlabors.com/products/imagesharp/)
    или Skia:(https://github.com/mono/SkiaSharp) - в них меньше ограничений, чем у стандартного Bitmap, но всё равно врядли они смогут с гигантскими картинками работать.
    Ответ написан
    Комментировать
  • Вопрос по двумерным массивам?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    GetLength возвращает размерность каждого измерения.
    GetLength(0) - размер первого измерения (3)
    GetLength(1) - размер второго измерения (тоже три)
    Об этом сказано в документации: https://docs.microsoft.com/en-US/dotnet/api/system...
    Gets a 32-bit integer that represents the number of elements in the specified dimension of the Array.


    i используется для индексирования в рамках первого (0) измерения.
    j используется дли индексирования в рамках второго (1) измерения.
    Ответ написан
    Комментировать
  • Чем отличаются эти два типа записи?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Эти две записи полностью эквивалентны, в чём можно убедиться через sharplab, выбрал декомпиляцию в более низкоуровневый C#.
    Во втором случае используется Object Initializer синтаксис.
    Второй более идиоматичный и ИМХО более читабельный.
    Ответ написан
    Комментировать
  • Как адекватно округлить Int до тысячи в сокращенной форме?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    textCost.text = ShortFormat((double) cost);
    
    // ...
    static string ShortFormat(double number) => number > 1000 ? $"{number/1000:F2}K" : number.ToString();
    Ответ написан
    Комментировать
  • Проблема с заполнением данных?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Поиграю в угадайку. Видимо, у тебя ошибка на моменте, когда ты пытаешься присвоить свойству Accounts объект Account.
    Причина ошибки очевидна - ты сам объявил, что Accounts имеет тип HashSet`Account.

    Вот вариант исправленного кода:
    var user = new User
                {
                    TelegramUserId = addSteamAccount.TelegramId,
                };
    user.Accounts.Add(new Account { SteamId = addSteamAccount.SteamId });


    В будущем пиши, какая конкретно ошибка у тебя произошла и постарайся изолировать свою ошибку от всего остального проекта, ибо EF тут никаким боком не влияет, как и то что ты делаешь API, и то что у тебя есть ещё класс Inventory.
    Ответ написан
    Комментировать
  • Как Dictionary отобразить в html-шаблоне?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Для вывода всех пар:
    {{#each dict}}
    <div>{{@key}}=>{{@value}}</div>
    {{/each}}


    Для вывода значения по какому-то заранее известному, предопределённому ключу:
    {{dict.[wellknown key]}}

    Модель, которую передаём в параметры:
    var args = new {dict = new Dictionary<string,string>()};
    var compiledTemplate = Handlebars.Compile(template);
    string templateOutput = compiledTemplate(args);
    Ответ написан
    Комментировать
  • ASP.NET CORE это фреймворк который следует паттерну MVC, а паттерн MVC предполагает как бэкенд так и фронтенд разработку?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    что это больше full стек фреймворк

    Ошибаешься. ASP NET Core отвечает только за обработку http-запросов и жизненный цикл приложения.
    В этом плане он больше похож на какой-нибудь чисто бэкендовый фреймворк типа Nest.js

    full stack - это ASP NET Core MVC с Razor Pages (или с Blazor).
    Он как раз будет похож на Django с его html-шаблонами и jinja.

    Меня интересует только бэкенд разработка, мне обязательно при изучении asp.net core знать html и css?

    Конечно не обязательно, если ты не собираешься делать фронт.

    Как пример архитектуры можешь посмотреть на eShopOnWeb и eShopOnContainers (к каждому из них прилагается бесплатная книга с подробным описанием) - в них как раз есть пример разделения web api и UI с MVC

    Вот схема, как сделан eShopOnContainers к примеру (обрати внимание на разделение API и webApp)
    eShopOnContainers-architecture.png
    Ответ написан
    2 комментария
  • Как удалить объект переменной var в Юнити?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Тебе нужно либо сохранить этот объект в поле.

    Либо в OnTriggerExit как-то его найти на сцене (по имени, типу, тегам, parent, по взаимодействию с триггером. Как угодно)
    Ответ написан
  • Как реализовать архитектуру для регуляр отправки сообщенийя в Telegram?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист

    1. сохранять то что ввел пользователь в БД

    Заводишь БД и сохраняешь туда. В реляционке это будет три колонки (минимум): Id, user id, text
    Без конкретики сложно подсказать.


    2. регулярно отправлять информацию пользователю.

    Если регулярность определяет пользователь, то проще это будет реализовать на уровне кода при помощи Quartz или Hangfire - они позволяют описывать регулярные задачи и создавать их из кода.

    Если регулярность одинаковая для всех пользователей - можно в отдельном процессе через сторонний планировщик (например cron)

    Для реализации бота можешь использовать библиотеку Telegram.Bot. Давно ей не пользовался, и вроде там из коробки только поллинг есть, но я бы советовал использовать вебхуки с asp net core.

    В принципе никто не запрещает использовать от Telegram.Bot только dto-шки и возможность отправлять запросы в telegram bot API


    как реализовать 2 задачу вместе с 1-й ?

    При такой постановке - это две независимые задачи.


    какой паттерн реализовать ?

    Да тут вообще никаким особым паттерном и не пахнет.


    Просто сделать асинхронную задачу?

    Что это вообще значит?


    Сейчас приходит на ум просто еще одну прогу сделать которая будет регулярно отправлять информацию пользователю

    Звучит как вполне рабочий вариант
    Ответ написан
    Комментировать
  • Как заставить телеграмм бота работать постоянно?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Используй Console.Cancelkeypress и TaskCompletionSource, чтобы можно было закрыть нажатием ^C

    Примерно так:
    var cts = new TaskCompletionSource();
    Console.CancelKeyPress += () => cts.SetResult();
    await cts.Task;


    Либо ты можешь использовать generic host (загугли) с IHostedService

    Либо ты можешь перейти на asp net core и начать использовать вебхуки, вместо поллинга

    Заворачивать ли это в виндовые сервис, чтобы он автоматом перезапускал при падении и запускал при включении - это на твоё усмотрение.
    Ответ написан
    Комментировать
  • Как экранировать строку со множеством кавычек одной ковычкой?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    На данный момент в C# так сделать нельзя, но в ближайшие месяцы выйдет NET 7 с C# 11, в котором так можно:
    https://learn.microsoft.com/en-us/dotnet/csharp/la...
    Но ты уже можешь использовать их в preview режиме.

    А пока либо экранируй каждую кавычку \, либо используй @"" и пиши по две кавычки, либо читай строку из файла
    Ответ написан
    Комментировать
  • Почему msbuid создает dll и exe?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Есть опция PublishSingleFile - как раз склеит DLL и exe.

    self-contained можно отключить
    dotnet publish -c Release -r win-x64 -o ./pub -p:PublishSingleFile=true --self-contained false
    Ответ написан
    8 комментариев
  • Что стоит прочесть первым?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    CLR via c# ориентирован больше на разработчиков, которые уже достаточно хорошо знают C#, чтобы активно его применять, но интересуются недрами CLR.

    Так что я бы начал с изучения самого Шарпа, не важно каким способом.

    PS: clr via c# местами устарел, так что некоторые советы из него следует воспринимать с долей скептицизма, да и сам его автор имеет немного специфичные взгляды.
    Ответ написан
    Комментировать
  • Подойдёт ли книга "Изучаем C# через разработку игр на Unity" для изучения c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Эта книга больше про Unity, чем про C#.
    Ответ написан
    Комментировать
  • Правильно ли я реализую свойство с "частичной поддержкой"?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Вообще это нарушение принципа подстановки Лисков.
    Тот кто зависит от BaseFormContext ожидает, что можно вызвать set у свойства IsFormReadyToSend, а ты тут кидаешь NotSupported.

    Более разумное тут решение - вообще не определять IsFormReadyToSend в BaseFormContext и обойтись интерфейсом с геттером.
    А конкретный наследник уже сам решит, что будет делать геттер, и нужен ли вообще сеттер.
    Ответ написан
  • Как достать участников чата?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    var chatFull = await client.GetFullChat(peer);
    foreach (var (id, user) in chatFull.users)
        Console.WriteLine(user);
    Ответ написан
  • Как в условии сказать "объект повернут на -90 по Y" на Unity c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Тк тут числа с плавающей точкой, то у тебя никогда не будет ровно "-90".
    По тому тебе нужно определить какой-нибудь диапазон (-80..-110 градусов) например, и проверять, что угол поворота объекта находится в этом диапазоне.
    Ответ написан
  • Стоит ли заморачиваться с проверкой не совпадения Guid?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    GUID генерируется не полностью случайно, а с использованием идентификатора машины и времени, что сильно снижает шанс коллизии.

    К слову скажу, что за всё время работы в разных компаниях я ни разу не слышал о коллизиях GUID, которые бы реально произошли. Даже на очень нагруженных распределённых системах.
    Ответ написан
    3 комментария
  • GET запрос в WEB-API?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    System.Text.Json.JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles. Path:

    Дело в том, что у тебя в объекте есть циклические ссылки.
    Чтобы от этой ошибки избавиться есть два варианта:
    1. Руками смаппить модель из базы в модель для фронта (что очень рекомендую. Возвращать модели напрямую из DbContext не безопасно)
    2. Настроить jsonserializer, чтобы он при обранужении циклических ссылок заменял их на null.
    Сделать это можно так:
    // Там где ты регистрируешь сервисы
    services
        .AddMvcCore() // или .AddMvc()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web)
            {
                ReferenceHandler = ReferenceHandler.IgnoreCycles // или ReferenceHandler.Preserve
            };
        });
    Ответ написан
    Комментировать