Ответы пользователя по тегу C#
  • При сборке в visual studio выдаёт много ошибок. Возможно ли собрать это решение с github?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    - он успешно апгрейдится до 4.8
    - но ошибок не меньше, 2 nuget библиотеки очень изменились.. точнее одна живая, про вторую не понял
    - пересобирая проекты по одному, с конца, в середине разрулил ошибку.. но дальше пошли пачками, без мотивации не пойдет.. сори..
    .. за 6 лет дотнет ушел далеко... и не все либы писались достаточно грамотно. в частности dbLite там 3,11, а на дворе уже 5 с чем то.. как раз с ней мне удалось исправить ошибку за минуты...
    4 проекта снизу уже компилирутся
    yvSncU1.png
    .. а фрагмент кода - там в качестве аргумента передавался предикат, теперь только айди, но интеллисенс подсказала, что айди ищется по предикату.. теперь и этот проект компилируется... но когда начинает сыпать с 10 ошибок... не, это уже не минутное развлечение )))
    ... один из двух nuget вообще отмечен как устаревший... если заброшен, то это и правда может быть тупик..
    самому проекту 6 лет... он сам заброшен.. увы

    pps да и по исправленному фрагменту (типа компилируется)... большой вопрос по исходной логике - толи один элемент удалить? то ли все по предикату?! (условие)... что тоже не проблема...

    но учитывая количество вложенных проектов, и заброшенность либы по winforms... так... стопе... после прогулки деприкатов уже нет... любопытненько... на 8 проектов лишь 13 ошибок...

    ... но не минутная развлекуха. по любому. см "pps"... местами еще придется вкуривать логику... и не всегда это будет просто
    Ответ написан
  • Как решить проблему с типами данных?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    определение AlphabeticNotation в студию!
    ... а то у меня подозрения, что это символьная арифметика безразмерной величины. тогда типовые рецепты не пойдут, нужно приведение типа, но с учетом размерности... не так
    HealthBarImage.fillAmount = (float) HealthBossNow / HealthBoss;
    а скорее так
    HealthBarImage.fillAmount = ((double) HealthBossNow) / ((double) HealthBoss);
    а еще в студию тип HealthBarImage.fillAmount... а еще, возможно допустимо перегрузить оператор деления для AlphabeticNotation... и это лучший вариант, но он требует понимания типа, языка.. ну и математики )))

    ps а если это еще и двухмерная величина.... то вам еще над многим придется подумать
    Ответ написан
    Комментировать
  • Как быстро освоить c#, если я работаю на c++?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    базовый синтаксис в основах вообще почти один. но ментальность другая. мелкий проект куда ни шло, если веб и/или службы... работа с бд..
    за 2-3 дня вряд ли..
    был у меня случай, переводил проект что то порядка 1500 строк с c++ на c#, вышло примерно в 2 раза меньше строк, и работало быстрее (плюсовый явно многими авторами довольно криво дописывался)... однако способность прочитать, и перепроверить в дебагере, не дала мне способности писать на плюсах )))

    ps на языке, надо в некотором смысле "думать"... плюсовый вектор, и лист шарпа, похожи только на первый взгляд..
    в шарпе есть перегрузки, в тч операторов, но не так популярны (я лично тащусь, но логика уже другая)...
    ... в общем все зависит от масштабов и сложности проекта..
    ... сходство базового синтаксиса, как раз может сыграть коварную роль
    но кто не рискует ... ;)))
    Ответ написан
  • Как в C# использовать апостроф в значениях env переменных?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Console.WriteLine(Environment.GetEnvironmentVariable("forqna", EnvironmentVariableTarget.Machine));
    выхлоп
    FRjjQ0H.png


    ... или я не понял вопроса?

    ps если надо присвоение в коде, как то так думаю..
    Console.WriteLine(Environment.GetEnvironmentVariable("forqna", EnvironmentVariableTarget.Machine));
    Console.WriteLine(@"'test");
    мы об этом апострофе?
    LSKgHYp.png


    pps а вот хранение пароля в открытом виде, так себе идея.. тут и правда не грех применить какой то способ кодирования, а в коде раскодировать ;))
    вариант от Василий Банников, это минималка (сам бы сильнее замутил.. ну.. старый параноик)..
    Ответ написан
    5 комментариев
  • Почему потоки накапливаются и не уничтожаются?

    mindtester
    @mindtester Куратор тега Windows
    http://iczin.su/hexagram_48
    любой прототип процесса можно дебажить как консоль (или множество)..
    отладчик в руки!

    ps а так то утечка... вопрос чего? ;))

    pps отладочные записи в лог файлы, или в журнал.. ну это уже для процесса.
    для консолей - консоль и сила в отладке ))
    Ответ написан
    Комментировать
  • Объясните мне на пальцах рекурсию Фибоначчи F(4, например). Это самый простой алгоритм, а я не могу понять. Что мне делать?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    это функциональный стиль. может в том проблема? попробуйте тот же C#? Си? (без плюсов для начала).. любой диалект Pascal?
    ... это именно что бы понять.. а так, против питона ни че личного ))
    разглядел теги... ща.. дабавлю..
    изучите легкую модификацию алгоритма.. ну и проще с хранилищем, чем сразу с рекурсией.. просили же на пальцах? ;))
    namespace ConsoleApp1
    {
        public static class Fib
        {
            static List<int> fib = new List<int>();
            static int max = 15;
            public static void Main()
            {
                for (var i = 0; i < max; i++)
                {
                    if (i == 0) fib.Add(0);
                    else if (i == 1) fib.Add(1);
                    else fib.Add(fib[i - 1] + fib[i - 2]);
                    fib.print();
                    "... next step...".print();
                }
            }
            public static void print(this string s) => Console.WriteLine(s);
            public static void print(this List<int> l) { foreach (var i in l) i.ToString().print(); }
        }
    }
    - функциональный стиль крут лаконичностью....
    - слаб не предсказуемостью времени выполнения (а так же рисками переполнения стека..
    - изучите что такое хвостовая рекурсия.. (после того как разберетесь с моей версией... ;)))... удачи
    .. ну или так еще..
    namespace ConsoleApp1
    {
        public static class Fib
        {
            static List<int> fib = new List<int>();
            static int max = 15;
            public static void Main()
            {
                fib.Add(0);
                fib.Add(1);
                for (var i = 2; i < max; i++)
                {
                    fib.Add(fib[i - 1] + fib[i - 2]);
                    fib.print();
                    "... next step...".print();
                }
            }
            public static void print(this string s) => Console.WriteLine(s);
            public static void print(this List<int> l) { foreach (var i in l) i.ToString().print(); }
        }
    }
    нарушения сна.. надо чем то заняться ))
    .. и так, рекурсия мощный инструмент.. но особенно когда мы знаем некие принципы по кускам, а связать их нам трудно (привет Prolog ;)...
    беру ваш исходный пример, и добавляю трассировку ;)
    namespace ConsoleApp2
    {
        public static class recursion
        {
            static long callcnt = 0;
            static int fib(int n)
            {
                $"_fib calling {++callcnt} count".print();
    
                var res = 0;
    
                if (n == 0 || n == 1) res = n;
                else res = fib(n - 1) + fib(n - 2);
    
                $"_fib return {res}".print();
    
                return res;
            }
            static int max = 15;
            public static void Main()
            {
                for (var i = 0; i < max; i++)
                {
                    "... next fib...".print();
                    fib(i).ToString().print();
                }
            }
            public static void print(this string s) => Console.WriteLine(s);
            public static void print(this List<int> l) { foreach (var i in l) i.ToString().print(); }
        }
    }
    .. реализуйте, и сравните как растет стоимость выполнения с ростом глубины погружения (номера числа Фибоначчи).. оптимизацию для одного вызова не применял.. так нагляднее )))
    .. тем не менее, иногда рекурсия и красивый, и надежный способ решения запутанных задач )))
    .. но, возможно, дорогой по времени и ресурсам )))

    ... еще подправил, подумал так нагляднее ;)))... программируйте, пробуйте все ))
    Ответ написан
    5 комментариев
  • Почему C# не кроссплатформенный?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    C# кроссплатформенный. как и dotnet 8. другой вопрос - в линукс и осикс нет com.. к примеру.. нет winforfms... и это не проблема C#..
    есть тот же qt, и есть его.. ну если не порты, то обертки точно...
    вы сами не понимаете сути вопроса.. такое чувство, что вы хотите winforfms везде.. опробуйте MAUI
    Ответ написан
    4 комментария
  • Как преобразовать List в строку?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    using System.Runtime.CompilerServices;
    using System.Text;
    
    public static class ca2
    {
        public static void Main()
        {
            var d = new Dictionary<long, string>();
            var s = "";
            var sb = new StringBuilder();
            var rnd = new Random();
            var cnt = rnd.Next(8, 12);
            for (int i = 0; i < cnt; i++) d.Add(rnd.Next(), $"Name {i}");
            foreach (var v in d) sb.Append($"{v.Value} = {v.Key}, ");
            s = sb.ToString();
            s = s.Substring(0, s.Length - 2);
            s.print();
        }
        public static void print(this string s) => Console.WriteLine(s);
    }
    ... если интересует производительность StringBuilder впереди планеты всей...
    Ответ написан
    Комментировать
  • Как пройтись циклом по нескольки значениеям объекта?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    начнем с того что у вас
    await
    ... вы или уже понимаете... ну или надо понять..потом разбор.. но если разбор пустого места? может стоило подождать?... или подробнее
    Ответ написан
    22 комментария
  • Для кого операция добавления элемента в середину медленнее — для List или для LinkedList?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Проблема в том, что для LinkedList операция чтения O(n), вставки - O(1). Для List - операция чтения O(1), вставки - O(n). Получается, что скорость равна?
    если n=1, умозрительно да...
    .. ну а цена вопроса?... не? не слыхал?... я молчу по новые фишки распараллеливания... хотя и не знаю (пока) на сколько уместны...
    Ответ написан
  • Почему метод Cancel() объекта cancelTokenSource действует и на объект Task, которому в параметры конструктора токен не передаётся (см. внутри)?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    вообще то твой код не работает в дотнет8, при прямом копировании. ошибок не дает, но и ни чего не печатает.. поиграюсь.. а так то... смотри внимательно:
    CancellationToken token = cancelTokenSource.Token;
    ///...
        Task task2 = new Task(() =>
        {
            for (int i = 1; i < 10; i++)
            {
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("Операция прервана");
                    return;
                }
                Console.WriteLine($"2. Квадрат числа {i} равен {i * i}");
                Thread.Sleep(200);
            }
        });
    .. они у тебя в одной области видимости, и ты бодро проверяешь статус завершения.. зачем? ;)))
    ... решения?.. ну простейшее - CancellationTokenSource2 ... не быть же второй таске вечной..

    ps
    в 4,8 работает так
    using System.Threading.Tasks;
    using System.Threading;
    using System;
    
    class cancelTokenTest
    {
        static void Main(string[] args)
        {
            var cancelTokenSource = new CancellationTokenSource();
            var token = cancelTokenSource.Token;
    
            var cancelTokenSource2 = new CancellationTokenSource();
            var token2 = cancelTokenSource2.Token;
    
            var task = new Task(() =>
            {
                for (int i = 1; i < 100000; i++)
                {
                    if (token.IsCancellationRequested)
                    {
                        Console.WriteLine("Операция 1 прервана");
                        return;
                    }
                    Console.WriteLine($"1. Квадрат числа {i} равен {i * i}");
                    Thread.Sleep(200);
                }
            }, token);
    
            var task2 = new Task(() =>
            {
                for (int i = 10; i < 1000000; i++)
                {
                    if (token2.IsCancellationRequested)
                    {
                        Console.WriteLine("Операция 2 прервана");
                        return;
                    }
                    Console.WriteLine($"2. Квадрат числа {i} равен {i * i}");
                    Thread.Sleep(200);
                }
            }, token2);
    
            task.Start();
            task2.Start();
    
            Thread.Sleep(1000);
            cancelTokenSource.Cancel();
            Thread.Sleep(50); // без этого не успевает обновиться статус у меня..
            Console.WriteLine($"Task Status 1: {task.Status}");
            Thread.Sleep(1000);
            cancelTokenSource2.Cancel();
            Thread.Sleep(200); // можете закаментить для сравнения, и поиграть со значениями..
            Console.WriteLine($"Task Status 2: {task2.Status}");
            cancelTokenSource.Dispose();
            cancelTokenSource2.Dispose();
        }
    }
    в дотнет 8 ... не сразу... но
    может устаревшие методы? но компилируются.. топят в пользу асинхронки?
    ... вот пример для 8
    https://learn.microsoft.com/ru-ru/dotnet/api/syste...
    обратите внимание на использование CancellationToken, он действительно обрывает исполнение до начала. можно конечно попытаться адаптировать под ваш случай.. но это если опять будет сильно не чего делать.. не отписывайтесь )))
    using System.Runtime.CompilerServices;
    
    public static class cancelTokenTest8and2task
    {
        public static void print(this string s) => Console.WriteLine(s);
        public static void Main()
        {
            var ts1 = new CancellationTokenSource();
            var tk1 = ts1.Token;
    
            var ts2 = new CancellationTokenSource();
            var tk2 = ts2.Token;
    
    
            var t1 = new Task(() => {
                for (int i = 1; i < 100000; i++)
                {
                    if (tk1.IsCancellationRequested)
                    {
                        "Операция t1 прервана".print();
                        return;
                    }
                    $"t1. Квадрат числа {i} равен {i * i}".print();
                    Thread.Sleep(200);
                }
            });
    
            var t2 = new Task(() => {
                for (int i = 1; i < 100000; i++)
                {
                    if (tk2.IsCancellationRequested)
                    {
                        "Операция t2 прервана".print();
                        return;
                    }
                    $"t2. Корень числа {i} равен {Math.Sqrt(i)}".print();
                    Thread.Sleep(200);
                }
            });
    
            t1.Start();
            t2.Start();
            Thread.Sleep(1000);
            ts1.Cancel();
            Thread.Sleep(50);
            $"\nTask1 status: {t1.Status}".print();
    
            Thread.Sleep(1000);
            ts2.Cancel();
            Thread.Sleep(200);
            $"\nTask2 status: {t2.Status}".print();
            ts1.Dispose();
            ts2.Dispose();
        }
    }
    работает в дот нет 8 ... кроме using System.Runtime.CompilerServices; я разницы пока не вижу (имена не в счет!)...
    Ответ написан
    Комментировать
  • Каким образом можно отправить сообщение (пакет) на другой компьютер с помощью C#(Серые статические адреса)?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    ни как. от слова совсем ни как...
    но можно опробовать:
    - покупку внешних ip у провайдеров (потом изучение проброса на роутерах..
    - https://ngrok.com/ .. но скорость будет не высока.. зато даром...
    Ответ написан
  • Как с помощью SIMD векторизации из массива float сделать bit массив знаковых битов?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    для начального хода мыслей
    var floatArray = new float[] { -999, 0, -9, -1, 2, 3, -1 };
    var bits = 0x00000000;
    
    int check(float f) => (f >= 0) switch
    {
        (true) => 1,
        _ => 0
    };
    
    string tobin(int i) => Convert.ToString(i, 2);
    
    foreach (var f in floatArray)
    {
        Console.Write(f);
        Console.Write($";\t{check(f)}");
        Console.Write($";\t{tobin(bits)}");
        bits = bits | (check(f) & 0x1);
        bits <<= 1;
        Console.WriteLine($";\t{tobin(bits)}");
    }
    .. хотя, если еще подумать.. вторичное маскирование излишне..
    var floatArray = new float[] { -999, 0, -9, -1, 2, 3, -1 };
    var bits = 0x00000000;
    
    int check(float f) => (f >= 0) switch
    {
        (true) => 1,
        _ => 0
    };
    
    string tobin(int i) => Convert.ToString(i, 2);
    
    foreach (var f in floatArray)
    {
        Console.Write(f);
        Console.Write($";\t{check(f)}");
        Console.Write($";\t{tobin(bits)}");
        bits = bits | check(f);
        bits <<= 1;
        Console.WriteLine($";\t{tobin(bits)}");
    }
    тат так так.. место сдвига важно!.. (выше по сути ошибка логики).. см итог
    var floatArray = new float[] { -999, 0, -9, -1, 2, 3, -1 };
    var bits = 0x00000000;
    
    int check(float f) => (f >= 0) switch
    {
        (true) => 1,
        _ => 0
    };
    
    string tobin(int i) => Convert.ToString(i, 2);
    
    foreach (var f in floatArray)
    {
        bits <<= 1;
        Console.Write($"{f};\t{check(f)};\t{tobin(bits)}");
        bits |= check(f);
        Console.WriteLine($";\t{tobin(bits)}");
    }

    ps SergeySerge11, а какая размерность вектора? если мегабайты, то может и имеет смысл. но если в предела 8, 16, 32 бит - из пушки по воробьям!
    мало того SIMD зависит от железа, а байткод нет
    Ответ написан
  • Что стоит учить с или c++ или c#?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    или по вкусу.. или оба! .. понимание различий даст быстрый рост многих пониманий ;)))
    PS
    Надо ли учить Си? Или может лучше начать с C#, а дальше уже выучу C++?
    уже три разных языка.. мое мнение - если хватит азарта, учите все ;)))
    .. и все внимание на различия областей применений и возможностей ;)))
    Ответ написан
    1 комментарий
  • Как нормализовать массив значений в цветовое представление?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    а вы с критериями определитесь..
    тогда и схему по легче выбрать будет..
    Ответ написан
    Комментировать
  • Какие бывают режимы работы сборщика мусора в .Net?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    https://learn.microsoft.com/ru-ru/dotnet/framework...
    https://habr.com/ru/articles/590475/

    .. совет - пока не поймете, в тч на экспериментах, используйте режимы по умолчанию ))

    ps пример - мой старый десктоп 4 ядра, новый ноут 20 ядер.. при попытке что то оптимизировать, даже успешной, потеряю универсальность.. а выбор рантайма будет весьма близок к лучшему возможному. как то так..
    Ответ написан
    2 комментария
  • Как организовать параллельную обработку пересечения нескольких Rectangle в WPF?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    а может plinq посмотрите?
    в любом случае это осмысленно только при большом количестве ядер.. и тяжелой обработке события..
    а еще стоит подумать о конкурентных событиях и риске одновременных противоречивых решений..
    если событий всего десятки (а не миллионы), а обработка событий не требует тяжелых вычислений, вообще не факт что стоит заморачиватся

    ps вариант избежать противоречий - своего рода покадровое вычисление поколения. матричная обработка следующей версии, потом замена текущей на новую. это гарантирует НЕпротиворечия в решении. ну и при необходимости уже можно смелее пробовать методы распараллеливания - на момет даже параллельной обработки, исходное поколение гарантированно неизменно. а вот при попытке параллельно обновлять по месту это скорее гарантия ошибочных решений
    .. да еще и с непредсказуемой вероятностью )))

    pps если не используете биндинг, можно логику обратного времени - копируем текущее поколение в фоновый массив/матрицу, далее используем вычисление следующего поколения на основе неизменных исходных данных.
    .. и еще о производительности - на сколько я помню жизнь, у вас затраты на визуализацию все равно не соизмеримо больше обсчета ;)))
    Ответ написан
    4 комментария
  • Как изменить свойства Label при помощи кода другого файла одного и того же проекта?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    вы не приводите сигнатуры классов. тогда телепатия предлагает что то вроде fr1.имя_поля
    а вообще то, обычно простой код, без навороченного мультитаскинга, в классе формы размещают..

    ps по факту корень зла Form1 fr1 = new Form1();.. очень печальный симптом..
    Денис Куликов, - еще раз, я готов позаниматься с вами.. но надо убрать понты и сотрудничать.. если что - в моем профиле телега. об оплате речь не стоит.. чистое сочувствие..

    pps
    начните с такой правки
    ...
    Screen[] sc = Screen.AllScreens;
    //  Form1 fr1 = new Form1();
    // тут внимательно сравните две следующие строки
    //  fr1.Location = sc[0].Bounds.Location;
    Location = sc[0].Bounds.Location;
    Application.EnableVisualStyles();
    // ... далее доступ к полям формы в таком же стиле - просто по имени
    // watcher у вас тоже уже есть. отдельный класс не нужен,
    // сначала запустите простейший тест, совершенствуйте после первого успеха
    ...
    .. хотя про watcher то что мелькнуло вроде локальная переменная метода. просто сделайте полем класса формы. в своем файле, дизайнер не трогаем. задаем поле формы, а инициализируем экземпляр и настройки так как уже начато.. и смотрим что там будет ломаться дальше )))
    .. был бы проект ))
    ... кидал бы поэтапные правки с каментами после дебага ;)... а вы все в крутизну играете? ))).. дедлайн и тд )))
    Ответ написан