Ответы пользователя по тегу C#
  • Как скрыть консоль в консольном приложении C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Смени тип выполняемого приложения с консольного приложения на оконное.
    В свойствах проекта с `Console Application` на `Windows Application`
    Ответ написан
    Комментировать
  • Как ограничить количество запросов на сервер при создании поисковика?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Лучше будет выставлять больший таймаут перед запросом. Т.е. если сейчас запрос делается спустя 0,5 сек после ввода, то сделай спустя 1 сек.

    Либо, чтобы запрос выполнялся, когда ввода не было X секунд
    Ответ написан
  • Как сделать чтобы квадратик менял гравитацию когда прикасается к порталу?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Может вместо 2.0f; писать -2.0f;.
    Ты же все-таки в противоположном направлении хочешь лететь
    Ответ написан
  • Что нужно для запуска консольного приложения C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Ты указал режим развертывания - зависит от платформы. Это значит, что там где выполняется приложение тоже должен быть установлен рантайм под который ты разрабывал.
    Попробуй либо под .net framework скомпилировать (он почти на каждой винде установлен).
    Либо выстави режим развертывания "независит от платформы" (или типа того, не помню название) - тогда можно будет запускать даже там, где .net не установлен
    Ответ написан
    1 комментарий
  • Какой тип лучше использовать для листа в Unity в данном случае?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Заносить ОБЪЕКТЫ.
    Разница будет в производительности - если хранить только id, то придется еще и искать нужный объект дополнительно. Все равно хранятся не объекты, а ссылки на них - разницы с числом почти никакой

    P.S. в данном контексте, правильно говорить "объект", а не "класс"
    Ответ написан
    3 комментария
  • Как составить регулярное выражение?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. В исходной строке заменяем все пробелы на '-'. Это обычный string.Replace
    2. Проверяем через регулярное выражение [a-z0-9\-]+

    // Входная строка
    var input = "Hello, world 2";
    
    // Заменяем пробелы на тире
    input = input.Replace(' ', '-');
    
    // Проверяем регулярным выражением
    var regex = new Regex(@"[a-z0-9\-]+");
    if (regex.IsMatch(input))
    {
        Console.WriteLine($"Соответствует");
    }
    else
    {
        Console.WriteLine($"Не соответствует");
    }


    P.S. вообще приведенный пример не соответствует поставке задачи: почему символы перевелись в нижний регистр, почему восклицательный знак исчез.
    Так же есть вопрос на счет табуляции и нескольких пробелов последовательно.
    Ответ написан
    Комментировать
  • Почему степенной ряд оканчивается NaN?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это значит на каком-то шаге (последнем) где-то получился double.NaN.
    Скорее всего это случилось здесь - Math.Pow(x, step * 2) / Fact((step * 2) + 1), т.к. факториал растет гораздо быстрее степенной функции и получилось так, что деление вернуло 0

    Попробуй использовать decimal вместо double, но тогда придется писать свою функцию возведения в степень (Math.Pow только с double работает)
    Ответ написан
    Комментировать
  • Как сделать шаблонный метод для мат операций с числами и Типом Vector2?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Интерфейсов чисел он не реализует. Есть 2 костыля:
    1. Вести словарь функций сложения
    var typeToFunc = new Dictionary<Type, AddFunc>() {{typeof(int), IntAdd}, {typeof(Vector2), Vector2Add}};
    
    var left = 123;
    var right = 14455;
    var result = Add(left, right);
    Console.WriteLine($"Результат сложения {left} и {right} = {result}");
    
    var leftVector = new Vector2(123, 55);
    var rightVector = new Vector2(55, 111);
    var resultVector = Add(leftVector, rightVector);
    Console.WriteLine($"Результат сложения {leftVector} и {rightVector} = {resultVector}");
    
    T Add<T>(T left, T right)
    {
        return ( T ) typeToFunc[typeof(T)](left, right);
    }
    
    object Vector2Add(object left, object right)
    {
        return ( Vector2 ) left + ( Vector2 ) right;
    }
    
    object IntAdd(object left, object right)
    {
        return (int) left + (int) right;
    }
    
    delegate object AddFunc(object left, object right);

    2. Создай монаду с int и Vector2
    var number = NumberOrVector2<int>.FromNumber(123);
    var newNumber = number.Add(() => 23, () => throw new InvalidOperationException("хранится число"));
    if (newNumber.TryGetNumber(out var result))
    {
        Console.WriteLine($"Получился результат: {result}");
    }
    else
    {
        Console.WriteLine($"Ошибка - хранился вектор");
    }
    
    public readonly struct NumberOrVector2<TNumber> where TNumber: unmanaged, INumber<TNumber>
    {
        private readonly TNumber _number;
        private readonly Vector2? _vector;
    
        private NumberOrVector2(TNumber number, Vector2? vector)
        {
            _number = number;
            _vector = vector;
        }
    
        public bool TryGetNumber(out TNumber number)
        {
            number = _number;
            return !_vector.HasValue;
        }
    
        public bool TryGetVector(out Vector2 vector)
        {
            vector = _vector.GetValueOrDefault();
            return _vector.HasValue;
        }
    
        public NumberOrVector2<TNumber> Add(Func<TNumber> numberAdd, Func<Vector2> vectorAdd)
        {
            if (_vector is {} vector)
            {
                return new NumberOrVector2<TNumber>(_number, vector + vectorAdd());
            }
    
            return new NumberOrVector2<TNumber>(_number + numberAdd(), null);
        }
        
        public static NumberOrVector2<TNumber> FromNumber(TNumber number)
        {
            return new NumberOrVector2<TNumber>(number, null);
        }
        
        public static NumberOrVector2<TNumber> FromVector(Vector2 vector)
        {
            return new NumberOrVector2<TNumber>(default, vector);
        }
    }
    Ответ написан
    Комментировать
  • Почему VSCode не создаёт блок Main при создании нового консольного приложения на C#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это называется Top Level Main - https://metanit.com/sharp/tutorial/1.4.php (начиная с C# 9)
    Кратко - нет смысла переделывать.
    Функциональность та же самая, разница только в том, что Main() генерируется компилятором, но преимущество - можно не заморачиваться над сигнатурой (например, можно влепить async/await и не менять void на async Task)
    Ответ написан
    Комментировать
  • Как отслеживать и выводить обновления базы данных?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. Здесь, скорее всего нужны триггеры. На SO есть похожий вопрос - https://stackoverflow.com/questions/26418412/how-t...
    2. В данном случае, тебе нужно использовать больше чем 1 СУБД. Предлагаю такой вариант:
    - MySQL - для хранения всех сообщений
    - Redis - для очереди событий

    Алгоритм такой:
    1. Кто-то отправляет сообщение
    2. Сохраняешь сообщение в БД
    3. Публикуешь событие "сообщение добавлено"
    4. Все подписавшиеся отправляют это сообщение своим клиентам

    Получение истории - при первом подключении (это уже SELECT)

    Т.е. тут без активного опроса.
    P.S. если сервер только 1, то и какая-нибудь inmemory очередь сообщений сойдет.

    3. SignalR твою проблему не решит - это просто фреймворк поверх вебсокета (рекомендую использовать его, т.к. облегчает многие задачи). Твоя проблема кроется скорее в слое хранения, т.к. mysql (как и любая другая реляционная СУБД) плохо заточена под event-driven архитектуру, скорее запрос-ответ.
    Ответ написан
    1 комментарий
  • Как исправить ошибку ложного подключения на стороне TcpClient?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для взаимодействия ты используешь TCP.
    Connect() возвращается, когда установлено соединение, но само соединение все еще может находиться в очереди - то, что здесь и происходит.
    Поэтому, лучше такое решение:

    const int maxPartySize = 2;
    var party = new List<TcpClient>();
    var locker = new object();
    
    var ip = IPAddress.Loopback;
    var port = 50000;
    var server = new TcpListener(ip, port);
    
    server.Start(128);
    Console.WriteLine("Сервер запущен..");
    
    while (true)
    {
        var client = await server.AcceptTcpClientAsync();
        _ = ProcessClientAsync(client);
        Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} подключен. Текущий размер группы: {party.Count}");
    }
    
    async Task ProcessClientAsync(TcpClient client)
    {
        await Task.Yield();
        bool added;
        lock (locker)
        {
            if (added = party.Count < maxPartySize)
            {
                party.Add(client);
            }
        }
    
        if (added)
        {
            Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} добавлен в группу");
        }
        else
        {
            Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} НЕ добавлен в группу");
        }
        
        client.Close();
    }


    P.S. когда принимаешь клиента не нужно писать using TcpClient client = ... иначе клиент закроется до начала его обработки
    Ответ написан
    Комментировать
  • Юнити выдаёт ошибку cs0103, что делать?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    CS0103
    Предпринята попытка использовать имя, которое не существует в классе, пространстве имен или области. Проверьте правильность написания имени и директивы using и ссылки на сборки, чтобы убедиться, что это имя доступно.


    GameObject drinksSp = instantiate(drinks[drinkInt]);


    Что за instantiate?
    Ответ написан
  • Что стоит учить с или c++ или c#?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Это 3 совершенно различных, с точки зрения целей, языка. Лучше пойми что ТЫ хочешь, а потом выбери
    Ответ написан
    Комментировать
  • Как вывести double число c определенным числом знаков ДО ЗАПЯТОЙ и После в сумме?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Тут нужен Math.Round, но зависит от того какое округление нужно
    var value1 = 13.444;
    var value2 = 13.446;
    // С параметром MidpointRounding.ToNegativeInfinity - без мат. округления, просто отбрасываются
    Console.WriteLine(Math.Round(value1, 2, MidpointRounding.ToNegativeInfinity));   // 13.44
    Console.WriteLine(Math.Round(value2, 2, MidpointRounding.ToNegativeInfinity));   // 13.44
    // Если нужно мат. округление
    Console.WriteLine(Math.Round(value1, 2));  // 13.44
    Console.WriteLine(Math.Round(value2, 2));  // 13.45

    Поиграйся с MidpointRounding параметром
    Ответ написан
    Комментировать
  • Какие бывают режимы работы сборщика мусора в .Net?

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

    Применять их никак не нужно. Платформа сама решит в каком режиме ей нужно работать.
    Такая сейчас идет политика разработки: "просто пиши код, а остальное на нас"
    Ответ написан
    3 комментария
  • Unity: ошибка "NullReferenceException" при взаимодействии с объектом. В чём может быть причина?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Не вижу инициализации _arm
    Ответ написан
    9 комментариев
  • Как исправить ошибку подключения к sql в visial studio?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    На сколько я понял, используется авторизация Windows (3 пункт).
    SO в таком случае говорит, что нужно заменить User Id и Password на Integrated Security=SSPI;

    Думаю, лучше настроить обычную авторизацию, а не через Windows - https://www.guru99.com/sql-server-create-user.html
    Ответ написан
    3 комментария
  • Как получить полный nameof к статическому методу?

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

    Console.WriteLine(NameOf(( ) => SomeStatic.Value ));
    
    static string NameOf<T>(Expression<Func<T>> path)
    {
        var members = new Queue<string>();
    
        Expression? exp = path.Body;
        while (exp is not null)
        {
            if (exp is MemberExpression memberExpression)
            {
                var prevName = memberExpression.Member.DeclaringType?.Name;
                if (prevName is not null)
                {
                    if (members.TryPeek(out var last) || last != prevName)
                    {
                        members.Enqueue(prevName);   
                    }
                }
                members.Enqueue(memberExpression.Member.Name);
                exp = memberExpression.Expression;
            }
            else
            {
                break;
            }
        }
        
        return string.Join('.', members);
    }
    
    class SomeStatic
    {
        public static int Value { get; set; }
    }
    Ответ написан
    2 комментария
  • HttpListener разбить URL запроса?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    1. Жесткие пути с файлами (favicon.ico в примере) - отдаешь нужный файл
    2. Префикс для путей файлов (/static/... например) - проверяешь файл и отдаешь ответ
    Ответ написан
    2 комментария
  • Картинки и файлы для проекта?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    В настройках проекта есть возможность указать файл как ресурс. Он будет копировать в выходную папку.

    В райдере это в свойствах файла задается: 657fe6fb3033c854326217.png

    P.S. параметр Copy to output directory
    Ответ написан
    5 комментариев