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

    При помощи kstr[N] ты обращаешься к N-ному СИМВОЛУ в строке.
    Тебе нужно сопоставить символ с цифрой и реальное число.
    Проще всего это можно сделать, отняв '0'.
    Код получается примерно такой:
    using System;
    int ks = 0;
    for (int i = 0; i < 999999; i++)
    {
        char[] kstr = i.ToString("D6").ToCharArray();
        var leftPartSum = (kstr[0] - '0' + kstr[1] - '0' + kstr[2] - '0');
        var rightPartSum = (kstr[3] - '0' + kstr[4] - '0' + kstr[5] - '0');
        if (leftPartSum == rightPartSum)
        {
            ks++;
            Console.WriteLine($"{i:D6}|{leftPartSum}={rightPartSum}");
        }
    }
    Console.WriteLine($"Total: {ks}");

    Но код можно улучшить:
    Вместо форматирования числа в строку и обращения к символам по индексу - использовать целочисленное деление и взятие остатка.
    PS:
    Вот сравнение по производительности

    Код:
    using BenchmarkDotNet.Running;
    using BenchmarkDotNet.Attributes;
    
    var summary = BenchmarkRunner.Run<DetectLuckyTicket>();
    
    [MemoryDiagnoser]
    public class DetectLuckyTicket
    {
        private readonly int ticketNumber;
        public DetectLuckyTicket()
        {
            ticketNumber = Random.Shared.Next(1, 1000000);
        }
    
        [Benchmark]
        public bool IsLuckyFast()
        {
            var leftPart = ticketNumber / 1000;
            var leftPartSum = (leftPart / 100) + (leftPart / 10 % 10) + (leftPart % 100);
    
            var rightPart = ticketNumber % 1000;
            var rightPartSum = (rightPart / 100) + (rightPart / 10 % 10) + (rightPart % 100);
    
            return leftPartSum == rightPartSum;
        }
    
        [Benchmark]
        public bool IsLuckySlow()
        {
            var kstr = ticketNumber.ToString("D6").ToCharArray();
            var leftPartSum = (kstr[0] - '0' + kstr[1] - '0' + kstr[2] - '0');
            var rightPartSum = (kstr[3] - '0' + kstr[4] - '0' + kstr[5] - '0');
            return leftPartSum == rightPartSum;
        }
    }


    Результат:
    // * Detailed results *
    DetectLuckyTicket.IsLuckyFast: DefaultJob
    Runtime = .NET 7.0.0 (7.0.22.15202), X64 RyuJIT; GC = Concurrent Workstation
    Mean = 6.417 ns, StdErr = 0.039 ns (0.60%), N = 15, StdDev = 0.150 ns
    Min = 6.113 ns, Q1 = 6.318 ns, Median = 6.408 ns, Q3 = 6.505 ns, Max = 6.671 ns
    IQR = 0.188 ns, LowerFence = 6.036 ns, UpperFence = 6.787 ns
    ConfidenceInterval = [6.257 ns; 6.577 ns] (CI 99.9%), Margin = 0.160 ns (2.49% of Mean)
    Skewness = -0.06, Kurtosis = 2.24, MValue = 2
    -------------------- Histogram --------------------
    [6.034 ns ; 6.193 ns) | @
    [6.193 ns ; 6.427 ns) | @@@@@@@@
    [6.427 ns ; 6.606 ns) | @@@@
    [6.606 ns ; 6.751 ns) | @@
    ---------------------------------------------------
    
    DetectLuckyTicket.IsLuckySlow: DefaultJob
    Runtime = .NET 7.0.0 (7.0.22.15202), X64 RyuJIT; GC = Concurrent Workstation
    Mean = 32.280 ns, StdErr = 0.250 ns (0.77%), N = 100, StdDev = 2.496 ns
    Min = 28.418 ns, Q1 = 30.360 ns, Median = 31.542 ns, Q3 = 33.921 ns, Max = 37.623 ns
    IQR = 3.561 ns, LowerFence = 25.018 ns, UpperFence = 39.264 ns
    ConfidenceInterval = [31.434 ns; 33.127 ns] (CI 99.9%), Margin = 0.847 ns (2.62% of Mean)
    Skewness = 0.63, Kurtosis = 2.09, MValue = 2.91
    -------------------- Histogram --------------------
    [28.207 ns ; 29.529 ns) | @@@@@@@
    [29.529 ns ; 30.941 ns) | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    [30.941 ns ; 32.596 ns) | @@@@@@@@@@@@@@@@@@@@@@@
    [32.596 ns ; 33.910 ns) | @@@@@@@@@@
    [33.910 ns ; 35.321 ns) | @@@
    [35.321 ns ; 36.733 ns) | @@@@@@@@@@@@@@@@@@@
    [36.733 ns ; 38.329 ns) | @@@
    ---------------------------------------------------
    
    // * Summary *
    
    BenchmarkDotNet=v0.13.1, OS=Windows 10.0.25131
    AMD Ryzen 5 4600H with Radeon Graphics, 1 CPU, 12 logical and 6 physical cores
    .NET SDK=7.0.100-preview.2.22153.17
      [Host]     : .NET 7.0.0 (7.0.22.15202), X64 RyuJIT
      DefaultJob : .NET 7.0.0 (7.0.22.15202), X64 RyuJIT
    |      Method |      Mean |     Error |    StdDev |    Median |  Gen 0 | Allocated |
    |------------ |----------:|----------:|----------:|----------:|-------:|----------:|
    | IsLuckyFast |  6.417 ns | 0.1599 ns | 0.1496 ns |  6.408 ns |      - |         - |
    | IsLuckySlow | 32.280 ns | 0.8467 ns | 2.4964 ns | 31.542 ns | 0.0382 |      80 B |
    
    // * Warnings *
    MultimodalDistribution
      DetectLuckyTicket.IsLuckySlow: Default -> It seems that the distribution can have several modes (mValue = 2.91)
    
    // * Legends *
      Mean      : Arithmetic mean of all measurements
      Error     : Half of 99.9% confidence interval
      StdDev    : Standard deviation of all measurements
      Median    : Value separating the higher half of all measurements (50th percentile)
      Gen 0     : GC Generation 0 collects per 1000 operations
      Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B)
      1 ns      : 1 Nanosecond (0.000000001 sec)


    UPD: А не работает у вас, скорее всего, из-за того что:
    1. Вы перебираете не все варианты, а только до 999998 включительно.
    2. У вас WriteLine отрабатывает на все числа, а не только на счастливые, тк перепутаны фигурные скобки.
    Ответ написан
    4 комментария
  • Как запустить C# в VSCode?

    Комментировать
  • Почему Random() возвращает одно и тоже значение в C#?

    Потому что Random генерирует не настоящие случайные числа, а производит определённые операции над сидом.

    Если ты сид не передаёшь, то он будет сгенерирован на основе времени.

    В твоём случае следовало создать один экземпляр Random и вызывать Next на нём.

    Ну и ещё этот класс не потокобезопасен, а по тому, если ты вызовешь Next в двух разных потоках одновременно - ты получишь одно и то же значение
    Ответ написан
    Комментировать
  • Зачем нужно писать using?

    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?

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

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

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

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


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

    Изучить WPF


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

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

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

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

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

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

    У меня класс Player стал слишком объемным

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

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

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

    Вспомнил олимпиадное программирование.
    Посмотрел по коду:
    Для генерации случайной строки размером 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?

    phpmyadmin - это не база, а только панель управления базой.
    Тебе же нужно узнать адрес и порт mysql, и использовать их.

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

    Ошибка возникает из-за того что 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?

    Mono это тоже .net, так что не должно быть проблем.

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

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

    У массивов и строк есть ограничение, что ты не можешь в них держать более чем int.MaxValue элементов (символов).

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

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

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


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

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

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

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

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

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

    Обращаться к элементам UI можно только из одного потока - того, в котором они созданы

    Починить можно так:
    https://docs.microsoft.com/en-us/dotnet/desktop/wi...
    Ответ написан
    Комментировать