Ответы пользователя по тегу C#
  • Зачем нужно писать using?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Visual Studio на новых версиях не добавляет using System; из-за того что в .NET 6 и C# 10 появились implicit usings
    А конкретно (в консоли):
    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Threading;
    using System.Threading.Tasks;

    Если ты их выключишь через <ImplicitUsings>disable</ImplicitUsings>, то ошибка появится.
    открыл онлайн компилятор, действительно ошибка

    Зависит от того, что за онлайн-компилятор.
    Ответ написан
    Комментировать
  • Из-за чего могла появиться ошибка CS1061 при работе с классом HttpResponseMessage?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Из сообщения об ошибке должно быть понятно, что компилятор не может найти метод ReadAsAsync.
    Значит его нет.
    А нет его из-за того что у тебя, видимо, старый net framework, а появился этот метод вроде только в net 5
    Ответ написан
  • Можно ли писать андроид приложения на C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ну Котлин сейчас даже популярнее чем Java.
    Xamarin в принципе по размеру и скорости запуска будет немного хуже, чем Java/Kotlin, при прочих равных.

    Сложнее будет зависимости искать - иногда может понадобиться свою обёртку для жавы написать, если нужно будет с какой-нибудь библиотекой компонентов для Android воспользоваться.

    А в остальном примерно то же самое
    Ответ написан
    3 комментария
  • Что нужно изучить для выполнения такого задания(WPF приложение которые из API будет брать информацию)?

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

     Это должно быть многостраничное приложение с навигацией.
     Использование MVVM (фреймворки также приветствуются).

    Изучить WPF


     На главной странице отображаются N лучших валют по популярности на каком-либо рынке
    (или топ-10 валют, возвращенных API).
     Страница с возможностью просмотра подробной информации о валюте:
    цена, объем, изменение цены, на каких рынках можно купить и по какой цене (т.
    возможность зайти на страницу валюты на рынке плюс).
     Возможность поиска валюты по названию или коду.

    Изучить документацию к API, из которого нужно будет брать эти данные.
    Изучить, как работать с этим API из C# (скорее всего, через HttpClient)
    Если API не предоставляет ручек для удобного поиска и сортировки - тогда надо будет их реализовать локально - для этого надо будет изучить основы C# и .NET, хотябы до уровня "могу написать запрос на LINQ"
    Если с предоставляемыми ручками и лимитами на запросы всё совсем грустно - придётся ещё все эти данные локально кэшировать, например в sqlite - тогда ещё надо будет изучить SQL и EF, и делать запросы уже на SQL и EF
    Ответ написан
    2 комментария
  • Как оптимизировать код?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Без структуры json-а, описания решаемой задачи и того, что лежит в ?коллекции? unique - сложно сказать.
    Начать можно с отказа от JObject
    Ответ написан
    Комментировать
  • Ошибка cs0246 как решить?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Вроде уже сегодня на этот вопрос отвечал.
    Суть ошибки написана в её описании.
    Учитывай, что C# учитывает регистр и для него vector и Vector - две большие разницы.
    А также C# не будет за тебя исправлять опечатки.
    Например он не будет заменять start на Start и FixUpdate на FixedUpdate

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

    Мультиаккаунт никак не ускорит получение ответа на вопрос, если его удаляют.
    Если хочешь хотябы минимальный шанс на помощь - прикладывай полный текст ошибки, и нормально отформатированный код (кнопка слева от плюса).
    А также говори, как ты пытался ошибку исправить и что тебе в её описании не понятно.
    Ответ написан
    Комментировать
  • Является ли хорошим тоном использование partial в Unity?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    У меня класс Player стал слишком объемным

    Скорее всего, в такой ситуации partial только замаскирует проблему дизайна, но не решит её.

    partial лучше всего использовать в ситуациях, когда у тебя код генерируется автоматически.
    Ответ написан
    Комментировать
  • Почему не запускается exe?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Чтобы можно было спокойно запускать экзешник - тебе нужно все зависимости положить рядом с ним.
    Делается это через "публикацию". Где это в студии накликать не подскажу, но в консоли это делается командой dotnet publish
    Ответ написан
    Комментировать
  • Генерация уникального рандомного значения?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Вспомнил олимпиадное программирование.
    Посмотрел по коду:
    Для генерации случайной строки размером 10 используется словарь из 9 символов
    => информации в этой строке около 31.7 бит. Что даёт нам 3486784401 разных вариантов. Что спокойно умещается в UInt32
    => задачу можно упростить до генерации ОДНОГО числа в этом диапазоне с последующим форматированием в эту десятисимвольную строку.

    Дополнительно можно немного оптимизировать, если для гарантии уникальности использовать не список, а hashset.
    А скорость генерации строки и требуемую память - путём выделения буфера на 10 символов заранее.
    И ещё немного оптимизации, путём создания одного экземпляра Random
    Вот такая реализация получилась:
    public sealed class UniqueStringGenerator
    {
        private const long MAX = 3486784401;
    
        private readonly Random _random;
        private readonly HashSet<long> _history;
    
        public UniqueStringGenerator(int seed)
        {
            _random = new Random(seed);
            _history = new HashSet<long>();
        }
    
        public UniqueStringGenerator()
        {
            _random = new Random();
            _history = new HashSet<long>();
        }
    
        public string Next() => Format(NextNumber());
    
        public void Reset()
        {
            _history.TrimExcess();
            _history.Clear();
    
        }
    
        private long NextNumber()
        {
    
            if (_history.Count >= int.MaxValue)
            {
                throw new InvalidOperationException("Variants exceeded. Please reset");
            }
            var next = _random.NextInt64(0, MAX);
            while (_history.Contains(next))
            {
                next = _random.NextInt64(0, MAX);
            }
            _history.Add(next);
            return next;
        }
    
        private static string Format(long number) => string.Create<long>(10, number,
            static (span, number) =>
            {
                 // Алгоритм по-лучше придумать не смог.
                 // Проходимся по каждому биту числа, понемногу сужая выбор между числами в словаре.
                const string DICTIONARY = "123456789";
                for (var i = 0; i < span.Length; i++)
                {
                    var range = 0..DICTIONARY.Length;
                    while (!range.Start.Equals(range.End.Value))
                    {
                        var length = range.End.Value - range.Start.Value;
                        var step = length / 2;
                        if (step == 0)
                        {
                            break;
                        }
                        if ((number & 1) == 0)
                        {
                            range = range.Start..(range.End.Value - step);
                        }
                        else
                        {
                            range = (range.Start.Value + step)..range.End;
                        }
                        number >>= 1;
                    }
                    span[i] = DICTIONARY[range.Start];
                }
            });
    }

    100к строк генерирует менее чем за секунду на моём ноуте.
    Хотя есть два недостатка (достаточно серьёзных):
    1. "1" и "9" - две наиболее редкие цифры
    2. последние две цифры - всегда единицы.
    Ответ написан
    Комментировать
  • Почему не удаётся подключиться к PhpMyAdmin?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    phpmyadmin - это не база, а только панель управления базой.
    Тебе же нужно узнать адрес и порт mysql, и использовать их.

    PS:
    1. Лучше пересмотри свою идею использования DbUtils и посмотри, как в других проектах работают с базой. На том же metanit есть примеры работы с Dapper и EF Core. Иначе он у тебя превратится со временем в сотню утилит и твой код в лучшем случае будет выглядеть как какая-то процедурщина а-ля 1С, а в худшем случае - как спагетти. И это не говоря об эффективности.
    2. Вместо поделия Oracle под названием MySql.Data лучше использовать библиотеку MySqlConnector (причины тут: https://mysqlconnector.net/)
    Ответ написан
    1 комментарий
  • Как присвоить массиву int значение символа из строки в строковом массиве?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ошибка возникает из-за того что Convert.ToInt32(char) выдаёт код символа, а не число.
    В твоём случае нужно так:
    var text = "123 321";
    var statistics = new int[10];
    var arrStr = text.Split(' '); // И не надо ничего предполагать. Под индексом 0 лежит 123
    
    Console.WriteLine(arrStr[0][0]); // выдаст 1 
    // Ошибка из-за того что Convert.ToInt32(arrStr[0][0]) == 49 - это код символа '1'
    // statistics[Convert.ToInt32(arrStr[0][0])] = 1; // ошибка переполнение массива
    
    // Гарантируем, что arrStr[0][0] - цифра и парсим её.
    var digit = arrStr[0][0];
    var idx = digit is >= '0' and <= '9'
      ? digit - '0'
      : throw new InvalidOperationException("Not a digit");
    statistics[idx] = 1; // Нет ошибки
    Ответ написан
    Комментировать
  • Можно ли использовать .net пакеты в godot?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Mono это тоже .net, так что не должно быть проблем.

    Но в случае с nlua проблемы будут, тк он нацелен на net6, а не netstandart
    Ответ написан
  • Ошибка CS0200 - Unity?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Комментировать
  • Сколько максимум можно хранить данных в консольной программе на C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    У массивов и строк есть ограничение, что ты не можешь в них держать более чем int.MaxValue элементов (символов).

    Ну и конечно ты не можешь хранить больше данных, чем у тебя есть оперативной памяти.

    В консоль ты можешь вывести сколько угодно - просто буфер консоли имеет ограниченные размеры и старые данные будут теряться.
    Ответ написан
    Комментировать
  • ASP.NET Core MVC это и есть ASP.NET MVC 5/6 или это разные?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Это разное.
    Первый для net Core и NET 5+, а второй для net Framework.
    Второй уже легаси и даже МС не рекомендует делать новые проекты на нём
    Ответ написан
    Комментировать
  • Как лучше организовать многопоточное добавление данных в словарь (Dictionary)?

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

    многопоточное добавление данных в словарь

    Dictionary не потокобезопасен, по тому при обращении к нему из нескольких потоков нужно синхронизировать потоки (желательно при любых обращениях)

    Лучше использовать ConcurrentDictionary - в нём уже решены потенциальные проблемы при конкурентном доступе (например попытке изменить запись, которая уже удалена в другом потоке или удаление удалённой, или создании уже существующей, или чтении несуществующей/удалённой)

    Interlocked exchange лучше смотреть по месту, может подойдёт, а может нет.

    На счёт инмемори базы тоже следует посмотреть на конкретную задачу.

    UPD: ещё как хорошее решение звучит использование System.Threading.Channels, раз задача стоит накапливать записи и батчем их отправлять в СУБД.
    Так мы гарантированно решаем проблему гонок, так как фактически менять данные будет только один поток
    Ответ написан
    Комментировать
  • Как исправить ошибку, возникшую с фоновым потоком?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Обращаться к элементам UI можно только из одного потока - того, в котором они созданы

    Починить можно так:
    https://docs.microsoft.com/en-us/dotnet/desktop/wi...
    Ответ написан
    Комментировать
  • Как можно проварьировать стандартные части программы Hello World на C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    хеллоуворд видится как какой-то буддистский коан.

    Минимальный современных хеллоу ворлд выглядит так:
    Console.WriteLine("Hello world!");

    Чтобы разобраться во всех следующих пунктах тебе следует продолжать изучать (хоть по курсу, хоть по книге), иначе всё расписывание само по себе потянет на небольшую книгу, или хотябы брошюру, и при этом врядли как-то тебе поможет:

    1. Можно просто убрать этот конкретный using, используя global usings или используя полные имена типов
    2. Можно не писать namespace или написать любой свой собственный. Или можно использовать file scoped namespace
    3. Можно придумать своё имя класса, можно сделать его статичным, можно сделать явно приватным или публичным.
    4, 5, 6. Main (точка входа) обязан быть статичным. Другие методы могут быть не статичными.
    Main можно сделать публичным или приватным, можно дать другое имя, но тогда придётся в опциях компилятора указать, какое имя.
    Main можно сделать асинхронным - тогда вместо void или int (Да, он может возвращать int) будет Task или Task<int>
    7,8,9. string[] args можно не указывать, или дать этому параметру другое имя (не args), но принимать что-то иное нельзя
    10,11. Это уже относится к телу метода и оно может быть любым. Но вместо Console.WriteLine можно написать полное имя - System.Console.WriteLine или сделать using static System.Console и тогда можно будет написать просто WriteLine
    Ответ написан
    5 комментариев
  • Как выполнить метод каждые 5 минут c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Использовать System.Threading.Timer или System.Threading.PeriodicTimer или цикл с await Task.Delay
    Ответ написан
    Комментировать
  • Как запустить .cs файлы без компиляции в exe?

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

    Потому что php - интерпретируемый язык.

    Каким образом я могу запускать .cs файлы без компиляции/ide?

    Никак, так как C# - компилируемый язык.
    Чисто теоретически ты можешь использовать C# Interactive, но там всё достаточно специфично и ограниченно.
    Ещё ты можешь компилировать C# из консоли через dotnet SDK
    Ответ написан
    Комментировать