Ответы пользователя по тегу C#
  • Как преобразовать 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 то что мелькнуло вроде локальная переменная метода. просто сделайте полем класса формы. в своем файле, дизайнер не трогаем. задаем поле формы, а инициализируем экземпляр и настройки так как уже начато.. и смотрим что там будет ломаться дальше )))
    .. был бы проект ))
    ... кидал бы поэтапные правки с каментами после дебага ;)... а вы все в крутизну играете? ))).. дедлайн и тд )))
    Ответ написан
  • На сколько Java отличается в обозначении типизации от C# для понятия TS?

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

    ps перечисленные языки, при попытке кодирования простейших примеров, могут показаться очень похожими. но это и есть подвох.
    что бы прочувствовать различия, стоит дорасти до решения не совсем тривиальных задач, что бы пришлось использовать козыри языков и прочувствовать различия.
    в данном наборе не все так просто - если шарп и ява могут сражаться на одном поле (консоль, десктоп), то ТС живет браузере. ну или если только в ноде?... в общем изначальная мотивация так себе
    Ответ написан
    21 комментарий
  • Кирилица в ответе HttpListenerResponse?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Сергей, до боли знакомая "кодировка"
    смотрим шпаргалку
    657dc0bcf3a83789501656.png
    вроде как utf-8 -> win-1251 собственно и была какое то время самой часто ошибкой.
    скорее всего надо копать в браузере, все что угодно, даже смену дефолтного шрифта проверить.
    в каментах под вопросом, допустил неоднозначность кодировки на серверной стороне самих файлов. вроде как менее вероятно. все популярные редакторы разработчиков/дизайнеров, давно в utf-8. да и визуал студия вроде как уже много лет корректно работает с веб проектами.
    начните с браузеров. если все по дефолту.. все таки посмотрите и исходники. far manager очень хорошо определяет и показывает реальную кодировку. mc вроде тоже.

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

    pps браузер точно не "ослик"? (интернет эксплорер в вин7?... тогда подобная ошибка была бы более ожидаема.. ну так.. мало ли?)
    Ответ написан
    1 комментарий
  • Почему в новом проекте не генерируется файл Themes/Generic.xaml?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Pixilys,
    один из трех создает шаблон, дальше думайте сами ;)
    e6Ewo7B.pngIJXy8BX.png
    Ответ написан
    Комментировать
  • Как прочитать адреса S7 - 1500 с помощью .NET?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    если на вашем
    S7 — 1500
    поддерживается dotnet, не сбивайте с толку ни себя, ни возможных авторов..
    - не лезьте в очередность байтов, в dotnet она всегда заточена под платформу
    -
    Например, имеется значение real на первом адресе сотого дата блока
    ни на одной платформе не используется realдля адресов, только беззнаковые целочисленные нужной разрядности
    - решайте проблему маленькими шагами (разбейте на этапы).. тогда и подсказки проще будет давать..
    Ответ написан
  • Как присвоить Key-значение переменной?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    а так не пробовали?
    if (expression)
        product = "хрен поймешь по вашей логике";

    cozrF1q.png
    может
    if (expression)
        product = product.ToUpper();
    ???
    Ответ написан
    Комментировать
  • Как читать данные из файла?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    что то примерно так (без теста)..

    var lst = File.ReadAllLines("bla..bla..bla");
    foreach (var s in lst) {var toks = (s).Split(':'); ...;};
    при работе с чистым текстом StreamReader в общем то и не нужен (!! важно, при больших объёмах файлов, чтение целиком, может критично расходовать память, в этом случае снова см ответ Василий Банников)
    по большой просьбе автора вопроса ))
    namespace list_and_parse
    {
        internal static class Program
        {
            internal static void Main(string[] args)
            {
                var lst = File.ReadAllLines("FileName.conf");
                foreach (var s in lst)
                {
                    var toks = s.Split(":");
                    string check() => (toks[0] == "Volume", toks[0] == "IsMarkers", toks[0] == "Mouse") switch
                    {
                        (true, _, _) => $"Volume={float.Parse(toks[1])}",
                        (_, true, _) => $"IsMarkers={bool.Parse(toks[1])}",
                        (_, _, true) => $"Mouse={int.Parse(toks[1])}",
                        _ => ".. ups (("
                    };
                    check().print();
                };
            }
            internal static void print(this string s) => Console.WriteLine(s);
        }
    }
    ... чуть ближе к реальному применению ))
    namespace list_and_parse
    {
        internal static class Program
        {
            internal static void Main(string[] args)
            {
                var Volume = 0.0;
                var IsMarkers = false;
                var Mouse = 0;
    
                var lst = File.ReadAllLines("FileName.conf");
                foreach (var s in lst)
                {
                    var toks = s.Split(":");
                    string check() => (toks[0] == "Volume", toks[0] == "IsMarkers", toks[0] == "Mouse") switch
                    {
                        (true, _, _) => $"Volume=>{double.TryParse(toks[1], out Volume)}",
                        (_, true, _) => $"IsMarkers=>{bool.TryParse(toks[1], out IsMarkers)}",
                        (_, _, true) => $"Mouse=>{int.TryParse(toks[1], out Mouse)}",
                        _ => ".. ups (("
                    };
                    check().print();
                };
                "".print();
                $"Volume={Volume}".print();
                $"IsMarkers={IsMarkers}".print();
                $"Mouse={Mouse}".print();
            }
            internal static void print(this string s) => Console.WriteLine(s);
        }
    }
    Ответ написан
  • Как сделать так, чтобы дополнительные проекты-библиотеки могли обращаться к тем же библиотекам, что и основной проект решения?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    к автору - вам явно пока не достает понимания зависимостей.
    но есть лазейка для обхода зависимостей при компиляции - скриптование во время выполнения )))
    опять же это довольно высокий уровень игры ;))
    Ответ написан
    Комментировать