Ответы пользователя по тегу C#
  • Как прописать redirect_uri для AspNet.Security.OAuth.Yandex?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Попробуй так:
    builder.Services.AddAuthentication().AddYandex(options => {
      options.CallbackPath = "/Identity/Account/Login"; // Раз у тебя такой пусть, как ты написал в комментариях.\
      // По умолчанию там /yandex-signin
    });
    Ответ написан
    1 комментарий
  • C# выдает ошибку CS8803 при вызове метода класса, как решить?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ну тебе же человеческим языком сказали, что твои statement-ы должны идти ДО объявлений классов.
    Тоесть вот так:
    App.Greeting();
    class App
    {
        public static void Greeting()
        {
            Console.WriteLine("Hello");
        }
    }
    Ответ написан
    Комментировать
  • Как создать бота, взаимодействующего со сторонним сайтом?

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

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

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

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

    И вообще за подобный код, как у вас в примере, по рукам бить надо.
    Вот это лучше будет гораздо:
    countOfIteration = Math.Min(width, height);
    А если так сильно хочется тернарник, то вот:
    countOfIteration = width > height
      ? height
      : width;
    Ответ написан
    Комментировать
  • Почему выходят ошибки "modifier 'private' is not valid for this item"?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Не закрыл фигурную скобку у Update, и получилось так, что функция Shoot и другие стали локальными (внутри Update).
    У локальных функций нет модификатора доступа, тк они и так доступны только внутри тех методов, в которых они объявлены.
    Ответ написан
  • Возможно ли реализовать несколько ботов в одном?

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

    Можно ещё один проект добавить с общим кодом, если он будет
    Ответ написан
    Комментировать
  • Можно ли сравнивать через переопределенный GetHashCode() в C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    GetHashCode - это не про сравнение, а про генерацию хэша для объекта.
    Хэши могут пересекаться, тк количество хэшэй принципиально меньше количества уникальных объектов.
    По тому, если тебе нужно ответить на вопрос "равен ли объект А объекту Б", то обязательно нужно проверить на Equals.
    Чтобы при разных типах у тебя не было ложного совпадения - просто сравнивай ещё и тип в Equals (через GetType)

    Если тебе нужно сравнить объекты по принципу больше/меньше/равно, то тут к тебе на помощь приходит интерфейс IComparable.
    Ответ написан
    2 комментария
  • Как установить C# библиотеку в VS Vode?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    В VS Code нет Package Manager Console, как в полноценной VS.
    По тому, для установки пакетов надо либо редактировать csproj-файл:
    <ItemGroup>
      <PackageReference Include="Vosk" Version="0.3.38" />
    </ItemGroup>

    Либо писать
    dotnet add package Vosk --version 0.3.38
    Ответ написан
    Комментировать
  • Есть ли действие противоположное к .Include в Entity Framework?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    А зачем это чинить на уровне EF, когда чинить надо на уровне сериализации?

    Почему ты пытаешься возвращать модели из БД в контроллере, вместо маппинга?
    (это на будущее - так делать не стоит, а то так по неосторожности ещё и конфиденциальную информацию на фронт выдашь)

    Ещё вариант - можно в сериализаторе включить обработку цикличных ссылок через метод Configure JsonOptions:
    builder.Services.Configure<JsonOptions>(options =>
    {
        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
    });

    То поведение, которое вы наблюдаете у себя - это нормально. (это в общем-то именно то, ради чего ORM и существует)
    Когда ты делаешь Include - у тебя связи грузятся и из A в B и из B в A, но не в C.
    ThenInclude нужен только чтобы прогрузить A -> B -> C
    Ответ написан
    7 комментариев
  • Аналог звёздного оператора распаковки * из python в c#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Нет, такого нет, но его можно имитировать при помощи Linq в некоторых случаях.
    Для передачи аргументов в функцию вообще нет никакого сахара - только руками по индексу можно вытаскивать.
    Ответ написан
    Комментировать
  • Как мне визуализировать огромное количество данных из xml-файла?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ваша история выглядит примерно так:
    1. Я по непонятным мне самому критериям выбрал язык разметки как формат для хранения данных.
    2. Задумался, что он таки не очень хорошо подходит для этой задачи
    3. Я хочу продолжать использовать этот формат, но хочу избавиться от проблем.

    Я думаю, вам стоит в принципе попробовать другой формат.
    Например, если у вас имеется очень много данных, над которыми потом надо производить аналитику - вам может подойти формат Parquet - он изначально для бигдаты и спарка придуман.

    Раз нужно много разных сортировок и фильтраций - можно попробовать, например, sqlite или другую, более полновесную СУБД.

    Если всё-таки хотите остаться на XML, то посмотрите в сторону поточного чтения документа с последующим преобразованием в какое-то внутреннее представление, с которым ваша программа сможет работать эффективнее (по сути вы так изобретёте свою СУБД на минималках с индексами и эффективной структурой)

    Для поточного чтения можно попробовать класс XMLReader


    Но самая большая загвоздка в том что пользователь может фильтровать или сортировать записи по своему усмотрению (по алфавиту, по дате или по другим признакам) как мне тогда запомнить последний визуализированный элемент?

    Нужно сортировать все данные, а не только те что показаны - тогда смещение будет работать ровно так, как ожидается
    Ответ написан
    Комментировать
  • Что из этого исходный код?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    bin и obj закидывай в .gitignore
    Остальное коммить.
    Ответ написан
    Комментировать
  • Как правильнее сравнить на практике языки программирования, чтобы понять, какой изучать?

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

    Если у вас есть цель попасть в финтех и работать над банковскими системами - тогда Java (но в банках и C# используется, кстати говоря, но чаще для других задач)

    Когда будешь уверенно себя ощущать - сможешь быстро за пару дней пробовать любой язык и формировать своё мнение о нём.
    Ответ написан
    4 комментария
  • Где брать примеры проектов ASP.NET CORE MVC?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Комментировать
  • Ошибка ввода, как исправить?

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

    vabka
    @vabka Куратор тега 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?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Ответ написан
    Комментировать
  • Почему Random() возвращает одно и тоже значение в C#?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Потому что Random генерирует не настоящие случайные числа, а производит определённые операции над сидом.

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

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

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